@openforis/arena-core 2.5.6 → 2.5.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -36,6 +36,10 @@ const isString = (arg) => typeof arg === 'string';
36
36
  export const getCycle = (record) => { var _a; return (_a = record.cycle) !== null && _a !== void 0 ? _a : defaultCycle; };
37
37
  export const getNodes = (record) => { var _a; return (_a = record.nodes) !== null && _a !== void 0 ? _a : {}; };
38
38
  export const getNodesArray = (record) => Object.values(getNodes(record));
39
+ /**
40
+ * Returns the node with the specified uuid, or undefined if not found.
41
+ * Like the other node getters, it does not throw an error when the node is not found.
42
+ */
39
43
  export const getNodeByUuid = positionalRecordGetter({
40
44
  getter: ({ record, uuid }) => { var _a; return (_a = record.nodes) === null || _a === void 0 ? void 0 : _a[uuid]; },
41
45
  isPositional: isString,
@@ -46,6 +50,9 @@ export const getNodesByUuids = positionalRecordGetter({
46
50
  isPositional: Array.isArray,
47
51
  toParams: (uuids) => ({ uuids }),
48
52
  });
53
+ /**
54
+ * Returns the root node, or undefined if the record has no nodes.
55
+ */
49
56
  export const getRoot = (record) => {
50
57
  const rootUuid = record._nodesIndex ? RecordNodesIndexReader.getNodeRootUuid(record._nodesIndex) : null;
51
58
  if (rootUuid) {
@@ -69,17 +76,18 @@ export const getChildren = positionalRecordGetter({
69
76
  isPositional: isRecordNode,
70
77
  toParams: (parentNode, childDefUuid) => ({ parentNode, childDefUuid }),
71
78
  });
79
+ /**
80
+ * Returns the only child of the parent node with the specified node def, or undefined if not found.
81
+ * Throws an error if more than one child is found.
82
+ */
72
83
  export const getChild = positionalRecordGetter({
73
84
  getter: ({ record, parentNode, childDefUuid, }) => {
74
85
  const children = getChildren({ parentNode, childDefUuid })(record);
75
- const errorParams = { childDefUuid, parentNodeUuid: parentNode.uuid, recordUuid: record.uuid };
76
- if (children.length === 1) {
77
- return children[0];
78
- }
79
86
  if (children.length > 1) {
87
+ const errorParams = { childDefUuid, parentNodeUuid: parentNode.uuid, recordUuid: record.uuid };
80
88
  throw new SystemError('systemError.record.multipleNodesFound', errorParams);
81
89
  }
82
- throw new SystemError('systemError.record.childNotFound', errorParams);
90
+ return children[0];
83
91
  },
84
92
  isPositional: isRecordNode,
85
93
  toParams: (parentNode, childDefUuid) => ({ parentNode, childDefUuid }),
@@ -180,6 +188,9 @@ export const findAncestor = (params) => (record) => {
180
188
  })(record);
181
189
  return result;
182
190
  };
191
+ /**
192
+ * Returns the specified node, if it has the specified node def, or its ancestor with that node def; undefined if not found.
193
+ */
183
194
  export const getAncestor = recordGetter((params) => {
184
195
  const { record, node, ancestorDefUuid } = params;
185
196
  if (node.nodeDefUuid === ancestorDefUuid)
@@ -224,6 +235,9 @@ export const getDescendantsOrSelf = recordGetter((params) => {
224
235
  }
225
236
  return currentAncestors; // currentAncestors is equal to the currentDescendants of the last level
226
237
  });
238
+ /**
239
+ * Returns the first descendant (or the node itself) with the specified node def, or undefined if not found.
240
+ */
227
241
  export const getDescendant = recordGetter((params) => {
228
242
  const { record, node, nodeDefDescendant } = params;
229
243
  return getDescendantsOrSelf({ node, nodeDefDescendant })(record)[0];
@@ -304,6 +318,7 @@ export const getEntityKeyNodesByDefUuid = recordGetter((params) => {
304
318
  const nodeDefKeys = keyDefs !== null && keyDefs !== void 0 ? keyDefs : Surveys.getNodeDefKeys({ survey, cycle, nodeDef });
305
319
  return nodeDefKeys.reduce((acc, nodeDefKey) => {
306
320
  const nodeKey = getDescendant({ node: entity, nodeDefDescendant: nodeDefKey })(record);
321
+ // missing key nodes are kept as undefined entries
307
322
  acc[nodeDefKey.uuid] = nodeKey;
308
323
  return acc;
309
324
  }, {});
@@ -1 +1 @@
1
- {"version":3,"file":"recordGetters.js","sourceRoot":"","sources":["../../../../src/record/_records/recordGetters.ts"],"names":[],"mappings":"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","sourcesContent":["import { Dictionary, TraverseMethod } from '../../common'\nimport { SystemError } from '../../error'\nimport { ArenaRecordNode, NodePointer, Nodes, NodesMap } from '../../node'\nimport { NodeValues } from '../../node/nodeValues'\nimport { NodeDef, NodeDefCode, NodeDefCodeProps, NodeDefProps, NodeDefs, NodeDefType } from '../../nodeDef'\nimport { defaultCycle, Surveys } from '../../survey'\nimport { Survey, SurveyDependencyType } from '../../survey/survey'\nimport { Arrays, Queue } from '../../utils'\nimport { ArenaRecord, RECORD_STEP_DEFAULT } from '../record'\nimport { RecordStepAnalysisCode } from '../recordStep'\nimport { RecordNodesIndexReader } from './recordNodesIndexReader'\nimport { NodeDefSelfReferences } from './nodeDefSelfReferences'\n\nexport type RecordParams = { record: ArenaRecord }\n\n/**\n * Record getter: takes the parameters first and the record as separate (curried) parameter: `getter(params)(record)`.\n * The deprecated form, with the record inside the parameters (`getter({ record, ...params })`), is still supported.\n */\nexport type RecordGetter<P extends RecordParams, R> = {\n /** @deprecated Pass the record as separate parameter: `getter(params)(record)` */\n (params: P): R\n (params: Omit<P, 'record'>): (record: ArenaRecord) => R\n}\n\nconst isRecordParams = (params: object): params is RecordParams => 'record' in params\n\nconst recordGetter = <P extends RecordParams, R>(getter: (params: P) => R): RecordGetter<P, R> =>\n ((params: P | Omit<P, 'record'>) =>\n isRecordParams(params)\n ? getter(params as P)\n : (record: ArenaRecord) => getter({ ...params, record } as P)) as RecordGetter<P, R>\n\n/**\n * Record getter (with parameters object) that also supports the deprecated form with positional parameters:\n * `getter(arg1, arg2)(record)`.\n */\nexport type PositionalRecordGetter<P, A extends unknown[], R> = {\n (params: P): (record: ArenaRecord) => R\n /** @deprecated Pass the parameters as an object: `getter({ ...params })(record)` */\n (...args: A): (record: ArenaRecord) => R\n}\n\nconst positionalRecordGetter = <P, A extends unknown[], R>(params: {\n getter: (params: P & RecordParams) => R\n isPositional: (firstArg: unknown) => boolean\n toParams: (...args: A) => NoInfer<P>\n}): PositionalRecordGetter<P, A, R> => {\n const { getter, isPositional, toParams } = params\n return ((...args: unknown[]) => {\n const getterParams = isPositional(args[0]) ? toParams(...(args as A)) : (args[0] as P)\n return (record: ArenaRecord) => getter({ ...getterParams, record })\n }) as PositionalRecordGetter<P, A, R>\n}\n\nconst isRecordNode = (arg: unknown): arg is ArenaRecordNode =>\n typeof arg === 'object' && arg !== null && 'uuid' in arg && 'nodeDefUuid' in arg\nconst isString = (arg: unknown): arg is string => typeof arg === 'string'\n\nexport const getCycle = (record: ArenaRecord): string => record.cycle ?? defaultCycle\n\nexport const getNodes = (record: ArenaRecord): Dictionary<ArenaRecordNode> => record.nodes ?? {}\n\nexport const getNodesArray = (record: ArenaRecord): ArenaRecordNode[] => Object.values(getNodes(record))\n\nexport const getNodeByUuid = positionalRecordGetter({\n getter: ({ record, uuid }: RecordParams & { uuid: string }): ArenaRecordNode | undefined => record.nodes?.[uuid],\n isPositional: isString,\n toParams: (uuid: string) => ({ uuid }),\n})\n\nexport const getNodesByUuids = positionalRecordGetter({\n getter: ({ record, uuids }: RecordParams & { uuids: string[] }): ArenaRecordNode[] =>\n uuids.map((uuid: string) => record.nodes?.[uuid]) as ArenaRecordNode[],\n isPositional: Array.isArray,\n toParams: (uuids: string[]) => ({ uuids }),\n})\n\nexport const getRoot = (record: ArenaRecord): ArenaRecordNode | undefined => {\n const rootUuid = record._nodesIndex ? RecordNodesIndexReader.getNodeRootUuid(record._nodesIndex) : null\n if (rootUuid) {\n return getNodeByUuid({ uuid: rootUuid })(record)\n }\n return getNodesArray(record).find((node) => !node.parentUuid)\n}\n\nexport const getChildren = positionalRecordGetter({\n getter: ({\n record,\n parentNode,\n childDefUuid,\n }: RecordParams & { parentNode: ArenaRecordNode; childDefUuid?: string }): ArenaRecordNode[] => {\n if (record._nodesIndex) {\n const childrenUuids = childDefUuid\n ? RecordNodesIndexReader.getNodeUuidsByParentAndChildDef({\n parentNodeUuid: parentNode.uuid,\n childDefUuid,\n })(record._nodesIndex)\n : RecordNodesIndexReader.getNodeUuidsByParent(parentNode.uuid)(record._nodesIndex)\n return getNodesByUuids({ uuids: childrenUuids })(record)\n }\n return getNodesArray(record).filter(\n (node) => node.parentUuid === parentNode.uuid && (!childDefUuid || node.nodeDefUuid == childDefUuid)\n )\n },\n isPositional: isRecordNode,\n toParams: (parentNode: ArenaRecordNode, childDefUuid?: string) => ({ parentNode, childDefUuid }),\n})\n\nexport const getChild = positionalRecordGetter({\n getter: ({\n record,\n parentNode,\n childDefUuid,\n }: RecordParams & { parentNode: ArenaRecordNode; childDefUuid: string }): ArenaRecordNode => {\n const children = getChildren({ parentNode, childDefUuid })(record)\n const errorParams = { childDefUuid, parentNodeUuid: parentNode.uuid, recordUuid: record.uuid }\n if (children.length === 1) {\n return children[0]\n }\n if (children.length > 1) {\n throw new SystemError('systemError.record.multipleNodesFound', errorParams)\n }\n throw new SystemError('systemError.record.childNotFound', errorParams)\n },\n isPositional: isRecordNode,\n toParams: (parentNode: ArenaRecordNode, childDefUuid: string) => ({ parentNode, childDefUuid }),\n})\n\nexport const getParent = positionalRecordGetter({\n getter: ({ record, node }: RecordParams & { node: ArenaRecordNode }): ArenaRecordNode | undefined =>\n node.parentUuid ? getNodeByUuid({ uuid: node.parentUuid })(record) : undefined,\n isPositional: isRecordNode,\n toParams: (node: ArenaRecordNode) => ({ node }),\n})\n\nexport const getNodesByDefUuid = positionalRecordGetter({\n getter: ({ record, nodeDefUuid }: RecordParams & { nodeDefUuid: string }): ArenaRecordNode[] => {\n if (record._nodesIndex) {\n const nodeUuids = RecordNodesIndexReader.getNodeUuidsByDef(nodeDefUuid)(record._nodesIndex)\n return getNodesByUuids({ uuids: nodeUuids })(record)\n }\n return getNodesArray(record).filter((node) => node.nodeDefUuid === nodeDefUuid)\n },\n isPositional: isString,\n toParams: (nodeDefUuid: string) => ({ nodeDefUuid }),\n})\n\nconst isNodeFlagTrue = (isChildFlagTrue: (parent: ArenaRecordNode, nodeDefUuid: string) => boolean) =>\n recordGetter((params: RecordParams & { node: ArenaRecordNode }): boolean => {\n const { record, node } = params\n const ancestorsAndSelf = getAncestorsAndSelf({ node })(record)\n for (let i = 0; i < ancestorsAndSelf.length - 1; i++) {\n const child = ancestorsAndSelf[i]\n const parent = ancestorsAndSelf[i + 1]\n if (!isChildFlagTrue(parent, child.nodeDefUuid)) return false\n }\n return true\n })\n\nexport const isNodeApplicable = isNodeFlagTrue((parent, nodeDefUuid) => Nodes.isChildApplicable(parent, nodeDefUuid))\nexport const isNodeEditable = isNodeFlagTrue((parent, nodeDefUuid) => Nodes.isChildEditable(parent, nodeDefUuid))\nexport const isNodeVisible = isNodeFlagTrue((parent, nodeDefUuid) => Nodes.isChildVisible(parent, nodeDefUuid))\n\nexport const getDependentCodeAttributes = positionalRecordGetter({\n getter: ({ record, node }: RecordParams & { node: ArenaRecordNode }): ArenaRecordNode[] => {\n if (record._nodesIndex) {\n const nodeUuids = RecordNodesIndexReader.getNodeCodeDependentUuids(node.uuid)(record._nodesIndex)\n return getNodesByUuids({ uuids: nodeUuids })(record)\n }\n throw new SystemError('record.nodesIndexNotInitialized')\n },\n isPositional: isRecordNode,\n toParams: (node: ArenaRecordNode) => ({ node }),\n})\n\nexport const getParentCodeAttribute =\n (params: { parentNode: ArenaRecordNode; nodeDef: NodeDefCode }) =>\n (record: ArenaRecord): ArenaRecordNode | undefined => {\n const { parentNode, nodeDef } = params\n\n const parentCodeDefUuid = NodeDefs.getParentCodeDefUuid(nodeDef)\n if (!parentCodeDefUuid) return undefined\n\n const ancestors = getAncestorsAndSelf({ node: parentNode })(record)\n for (const ancestor of ancestors) {\n const children = getChildren({ parentNode: ancestor, childDefUuid: parentCodeDefUuid })(record)\n if (children.length === 1) {\n return children[0]\n }\n }\n return undefined\n }\n\n// ancestors\n\n/**\n * Visits the specified node and its ancestors, from the node up to the root: the visit stops when the visitor returns true.\n */\nexport const visitAncestorsAndSelf = positionalRecordGetter({\n getter: ({\n record,\n node,\n visitor,\n }: RecordParams & { node: ArenaRecordNode; visitor: (node: ArenaRecordNode) => boolean | void }): void => {\n let currentNode: ArenaRecordNode | undefined = node\n while (currentNode) {\n if (visitor(currentNode)) return\n currentNode = getParent({ node: currentNode })(record)\n }\n },\n isPositional: isRecordNode,\n // deprecated form: the visit stops when stopIfFn returns true\n toParams: (node: ArenaRecordNode, visitor: (node: ArenaRecordNode) => void, stopIfFn?: () => boolean) => ({\n node,\n visitor: (visitedNode: ArenaRecordNode): boolean => {\n visitor(visitedNode)\n return !!stopIfFn?.()\n },\n }),\n})\n\n/**\n * Returns the first node satisfying the predicate among the specified node and its ancestors (from the node up to the root).\n */\nexport const findAncestor =\n (params: { node: ArenaRecordNode; predicate: (node: ArenaRecordNode) => boolean }) =>\n (record: ArenaRecord): ArenaRecordNode | undefined => {\n const { node, predicate } = params\n let result: ArenaRecordNode | undefined = undefined\n visitAncestorsAndSelf({\n node,\n visitor: (visitedNode) => {\n if (predicate(visitedNode)) {\n result = visitedNode\n return true\n }\n return false\n },\n })(record)\n return result\n }\n\nexport const getAncestor = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode; ancestorDefUuid: string }): ArenaRecordNode | undefined => {\n const { record, node, ancestorDefUuid } = params\n if (node.nodeDefUuid === ancestorDefUuid) return node\n\n let ancestor = getParent({ node })(record)\n while (ancestor && ancestor.nodeDefUuid !== ancestorDefUuid) {\n ancestor = getParent({ node: ancestor })(record)\n }\n return ancestor\n }\n)\n\n/**\n * Returns the list of ancestors from the given node to the root entity\n */\nexport const getAncestorsAndSelf = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode }): Array<ArenaRecordNode> => {\n const { record, node } = params\n const ancestors: Array<ArenaRecordNode> = []\n visitAncestorsAndSelf({\n node,\n visitor: (currentNode) => {\n ancestors.push(currentNode)\n },\n })(record)\n return ancestors\n }\n)\n\n// descendants\n\nexport const getDescendantsOrSelf = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode; nodeDefDescendant: NodeDef<any> }): ArenaRecordNode[] => {\n const { record, node, nodeDefDescendant } = params\n\n if (nodeDefDescendant.uuid === node.nodeDefUuid) return [node]\n\n const nodeDefDescendantFullHierarchy = [...nodeDefDescendant.meta.h, nodeDefDescendant.uuid]\n\n // 1. get the descendant node defs uuids starting from node nodeDefUuid (not inclusive) down to the specified nodeDefDescendant uuid\n const descendantNodeDefUuids = nodeDefDescendantFullHierarchy.slice(\n nodeDefDescendantFullHierarchy.indexOf(node.nodeDefUuid) + 1\n )\n // 2. for every level in the hierarchy, find the children having the nodeDefUuid equal to the current one\n let currentAncestors = [node]\n let currentDescendants: ArenaRecordNode[] = []\n for (const currentDescendantDefUuid of descendantNodeDefUuids) {\n for (const currentAncestor of currentAncestors) {\n currentDescendants.push(\n ...getChildren({ parentNode: currentAncestor, childDefUuid: currentDescendantDefUuid })(record)\n )\n }\n currentAncestors = currentDescendants\n currentDescendants = []\n }\n return currentAncestors // currentAncestors is equal to the currentDescendants of the last level\n }\n)\n\nexport const getDescendant = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode; nodeDefDescendant: NodeDef<any> }): ArenaRecordNode => {\n const { record, node, nodeDefDescendant } = params\n\n return getDescendantsOrSelf({ node, nodeDefDescendant })(record)[0]\n }\n)\n\nexport const isDescendantOf = (params: { node: ArenaRecordNode; ancestor: ArenaRecordNode }): boolean => {\n const { node, ancestor } = params\n return Nodes.getHierarchy(node).includes(ancestor.uuid)\n}\n\nexport const visitDescendantsAndSelf = recordGetter(\n (params: {\n record: ArenaRecord\n node: ArenaRecordNode\n visitor: (node: ArenaRecordNode) => boolean | void\n traverseMethod?: TraverseMethod\n }): void => {\n const { record, node, visitor, traverseMethod = TraverseMethod.bfs } = params\n\n if (traverseMethod === TraverseMethod.bfs) {\n const queue = new Queue()\n\n queue.enqueue(node)\n\n while (!queue.isEmpty()) {\n const visitedNode = queue.dequeue()\n\n if (visitor(visitedNode)) {\n // stop if visitor returns true\n return\n }\n\n const children = getChildren(visitedNode)(record)\n queue.enqueueItems(children)\n }\n } else {\n const stack = []\n\n stack.push(node)\n\n while (stack.length > 0) {\n const visitedNode = stack.pop() as ArenaRecordNode\n\n if (visitor(visitedNode)) {\n // stop if visitor returns true\n return\n }\n\n const children = getChildren({ parentNode: visitedNode })(record)\n\n // add children to stack in reverse order\n for (let index = children.length - 1; index >= 0; index--) {\n const child = children[index]\n stack.push(child)\n }\n }\n }\n }\n)\n\nexport const findDescendantOrSelf =\n (params: { node: ArenaRecordNode; predicate: (node: ArenaRecordNode) => boolean }) =>\n (record: ArenaRecord): ArenaRecordNode | undefined => {\n const { node, predicate } = params\n let found = undefined\n\n visitDescendantsAndSelf({\n node,\n visitor: (currentNode) => {\n if (predicate(currentNode)) {\n found = currentNode\n return true\n }\n return false\n },\n })(record)\n return found\n }\n\nconst getClosestAncestorNode = recordGetter(\n (params: {\n record: ArenaRecord\n node: ArenaRecordNode\n nodeDef: NodeDef<NodeDefType, NodeDefProps>\n dependentDef: NodeDef<NodeDefType, NodeDefProps>\n dependencyType: SurveyDependencyType\n }): ArenaRecordNode | undefined => {\n const { record, node, nodeDef, dependentDef, dependencyType } = params\n\n // 1a if dependent def is the same as node def, potentially all nodes with\n // nodeDefUuid === dependentDef.uuid in record could be dependent of nodeDef;\n // consider the root node as the closest ancestor node,\n // unless the node def references itself only among the children of its parent entity (e.g. validation \"dbh > 0\")\n if (nodeDef.uuid === dependentDef.uuid) {\n return NodeDefSelfReferences.isSelfReferenceLocal({ nodeDef, dependencyType })\n ? getParent({ node })(record)\n : getRoot(record)\n }\n // 1 find common ancestor def\n const commonAncestorDefUuid = Arrays.last(Arrays.intersection(nodeDef.meta.h, dependentDef.meta.h))\n if (!commonAncestorDefUuid) return undefined\n\n // 2 get ancestor node with common parent def\n return getAncestor({ node, ancestorDefUuid: commonAncestorDefUuid })(record)\n }\n)\n\ntype EntityKeyNodesGetterParams = {\n survey: Survey\n cycle?: string\n record: ArenaRecord\n entity: ArenaRecordNode\n keyDefs?: NodeDef<NodeDefType, NodeDefProps>[]\n}\n\nexport const getEntityKeyNodesByDefUuid = recordGetter((params: EntityKeyNodesGetterParams): NodesMap => {\n const { survey, cycle, record, entity, keyDefs } = params\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: entity.nodeDefUuid })\n const nodeDefKeys = keyDefs ?? Surveys.getNodeDefKeys({ survey, cycle, nodeDef })\n return nodeDefKeys.reduce((acc: NodesMap, nodeDefKey) => {\n const nodeKey = getDescendant({ node: entity, nodeDefDescendant: nodeDefKey })(record)\n acc[nodeDefKey.uuid] = nodeKey\n return acc\n }, {})\n})\n\nexport const getEntityKeyNodes = recordGetter(\n ({ record, ...otherParams }: EntityKeyNodesGetterParams): ArenaRecordNode[] =>\n Object.values(getEntityKeyNodesByDefUuid(otherParams)(record))\n)\n\nexport const getEntityKeyValuesByDefUuid = recordGetter((params: EntityKeyNodesGetterParams): Dictionary<any> => {\n const { record, ...otherParams } = params\n const keyNodesByDefUuid = getEntityKeyNodesByDefUuid(otherParams)(record)\n return Object.entries(keyNodesByDefUuid).reduce((acc: Dictionary<any>, [uuid, keyNode]) => {\n acc[uuid] = keyNode?.value\n return acc\n }, {})\n})\n\nexport const getEntityKeyValues = recordGetter(({ record, ...otherParams }: EntityKeyNodesGetterParams): any[] =>\n Object.values(getEntityKeyValuesByDefUuid(otherParams)(record))\n)\n\nexport const getEntitySiblings = recordGetter(\n (params: { record: ArenaRecord; entity: ArenaRecordNode; includeSelf?: boolean }) => {\n const { record, entity, includeSelf = false } = params\n const parentEntity = getParent({ node: entity })(record)\n if (!parentEntity) return []\n const siblingEntities = getChildren({ parentNode: parentEntity, childDefUuid: entity.nodeDefUuid })(record)\n return includeSelf ? siblingEntities : siblingEntities.filter((sibling) => !Nodes.areEqual(sibling, entity))\n }\n)\n\nexport const getAttributeSiblings = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode; nodeDef: NodeDef<NodeDefType, NodeDefProps> }) => {\n const { record, node, nodeDef } = params\n const parentEntity = getParent({ node })(record)\n if (!parentEntity) return []\n const siblingParentEntities = getEntitySiblings({ entity: parentEntity })(record)\n return siblingParentEntities.reduce((siblingsAcc: ArenaRecordNode[], siblingEntity) => {\n siblingsAcc.push(...getChildren({ parentNode: siblingEntity, childDefUuid: nodeDef.uuid })(record))\n return siblingsAcc\n }, [])\n }\n)\n\nexport const getNodeIndex = recordGetter((params: { record: ArenaRecord; node: ArenaRecordNode }) => {\n const { record, node } = params\n const parentEntity = getParent({ node })(record)\n if (!parentEntity) return 0 // root entity\n const siblings = getChildren({ parentNode: parentEntity, childDefUuid: node.nodeDefUuid })(record)\n return siblings.indexOf(node)\n})\n\nexport const findEntityByKeyValues = recordGetter(\n (params: {\n survey: Survey\n cycle: string\n record: ArenaRecord\n parentEntity: ArenaRecordNode\n entityDefUuid: string\n keyValuesByDefUuid: Dictionary<any>\n }): ArenaRecordNode | undefined => {\n const { survey, cycle, record, parentEntity, entityDefUuid, keyValuesByDefUuid } = params\n const entityDef = Surveys.getNodeDefByUuid({ survey, uuid: entityDefUuid })\n const siblingEntities = getChildren({ parentNode: parentEntity, childDefUuid: entityDefUuid })(record)\n if (NodeDefs.isSingle(entityDef)) {\n return siblingEntities[0]\n }\n const keyDefs = Surveys.getNodeDefKeys({ survey, cycle, nodeDef: entityDef })\n\n return siblingEntities.find((siblingEntity) => {\n const siblingEntityKeyValuesByDefUuid = getEntityKeyValuesByDefUuid({ survey, entity: siblingEntity, keyDefs })(\n record\n )\n return keyDefs.every((keyDef) => {\n const keyValue = siblingEntityKeyValuesByDefUuid[keyDef.uuid]\n const keyValueSearch = keyValuesByDefUuid[keyDef.uuid]\n return NodeValues.isValueEqual({\n survey,\n nodeDef: keyDef,\n value: keyValue,\n valueSearch: keyValueSearch,\n })\n })\n })\n }\n)\n\nexport const findEntityWithSameKeysInAnotherRecord = recordGetter(\n (params: {\n survey: Survey\n cycle: string\n entityUuid: string\n record: ArenaRecord\n recordOther: ArenaRecord\n }): ArenaRecordNode | undefined => {\n const { survey, cycle, entityUuid, record, recordOther } = params\n const entity = getNodeByUuid({ uuid: entityUuid })(record)\n if (!entity) return undefined\n\n let otherRecordCurrentParentEntity = getRoot(recordOther)\n if (!otherRecordCurrentParentEntity) return undefined\n\n const entityAncestorsAndSelf = getAncestorsAndSelf({ node: entity })(record)\n const ancestorDefUuidsAndKeys = entityAncestorsAndSelf.map((ancestor) => ({\n entityDefUuid: ancestor.nodeDefUuid,\n keyValuesByDefUuid: getEntityKeyValuesByDefUuid({ survey, entity: ancestor })(record),\n }))\n\n const ancestorDefUuidsAndKeysToVisit = [...ancestorDefUuidsAndKeys].reverse()\n\n for (let index = 1; otherRecordCurrentParentEntity && index < ancestorDefUuidsAndKeysToVisit.length; index++) {\n const { entityDefUuid, keyValuesByDefUuid } = ancestorDefUuidsAndKeysToVisit[index]\n otherRecordCurrentParentEntity = findEntityByKeyValues({\n survey,\n cycle,\n parentEntity: otherRecordCurrentParentEntity,\n entityDefUuid,\n keyValuesByDefUuid,\n })(recordOther)\n }\n return otherRecordCurrentParentEntity\n }\n)\n\nexport const getDependentNodePointers = recordGetter(\n (params: {\n survey: Survey\n record: ArenaRecord\n node: ArenaRecordNode\n dependencyType: SurveyDependencyType\n includeSelf?: boolean\n filterFn?: (nodePointer: NodePointer) => boolean\n }) => {\n const { survey, record, node, dependencyType, includeSelf = false, filterFn = null } = params\n const nodeDefUuid = node.nodeDefUuid\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: nodeDefUuid })\n const dependentDefs = Surveys.getNodeDefDependents({ survey, nodeDefUuid, dependencyType })\n const nodePointers: Array<NodePointer> = []\n\n const addToNodePointers = (nodePointer: NodePointer): void => {\n if (filterFn === null || filterFn(nodePointer)) {\n nodePointers.push(nodePointer)\n }\n }\n\n for (const dependentDef of dependentDefs) {\n // 1 find common ancestor node\n const commonAncestorNode = getClosestAncestorNode({ node, nodeDef, dependentDef, dependencyType })(record)\n if (!commonAncestorNode) continue\n\n const nodeDefDependentParent = Surveys.getNodeDefParent({ survey, nodeDef: dependentDef })\n if (!nodeDefDependentParent) throw new SystemError('record.nodes.dependents.dependencyOnRootFound')\n\n // 2 find descendant nodes of common parent node with nodeDefUuid = dependentDef uuid\n const dependentContextNodes = getDescendantsOrSelf({\n node: commonAncestorNode,\n nodeDefDescendant: nodeDefDependentParent,\n })(record)\n\n for (const dependentContextNode of dependentContextNodes) {\n addToNodePointers({\n nodeCtx: dependentContextNode,\n nodeDef: dependentDef,\n })\n }\n }\n if (includeSelf) {\n const parentNode = getParent({ node })(record)\n if (parentNode) {\n addToNodePointers({\n nodeCtx: parentNode,\n nodeDef,\n })\n }\n }\n\n return nodePointers\n }\n)\n\nexport const getAncestorCodePath = recordGetter(\n (params: {\n survey: Survey\n record: ArenaRecord\n parentNode: ArenaRecordNode\n nodeDef: NodeDef<NodeDefType.code, NodeDefCodeProps>\n }): string[] => {\n const { record, parentNode, nodeDef, survey } = params\n\n const getCodeAttributeItemCode = (codeAttribute: ArenaRecordNode | undefined): string => {\n const codeItemUuid = codeAttribute ? NodeValues.getItemUuid(codeAttribute) : undefined\n if (!codeItemUuid) return ''\n const item = Surveys.getCategoryItemByUuid({ survey, itemUuid: codeItemUuid })\n return item?.props.code ?? ''\n }\n\n const codePaths = []\n let currentParentCodeAttribute = getParentCodeAttribute({ parentNode, nodeDef })(record)\n\n while (currentParentCodeAttribute) {\n const ancestorItemCode = getCodeAttributeItemCode(currentParentCodeAttribute)\n codePaths.unshift(ancestorItemCode)\n const ancestorCodeDef = Surveys.getNodeDefByUuid({\n survey,\n uuid: currentParentCodeAttribute.nodeDefUuid,\n }) as NodeDefCode\n currentParentCodeAttribute = getParentCodeAttribute({ parentNode, nodeDef: ancestorCodeDef })(record)\n }\n return codePaths\n }\n)\n\nexport const getCategoryItemUuid = recordGetter(\n (params: {\n survey: Survey\n nodeDef: NodeDef<NodeDefType.code, NodeDefCodeProps>\n record: ArenaRecord\n parentNode: ArenaRecordNode\n code: string\n }): string | undefined => {\n const { survey, nodeDef, record, parentNode, code } = params\n const categoryUuid = nodeDef.props.categoryUuid\n\n const codePaths = [...getAncestorCodePath({ survey, parentNode, nodeDef })(record), code]\n\n const item = Surveys.getCategoryItemByCodePaths({ survey, categoryUuid, codePaths })\n\n return item?.uuid\n }\n)\n\nexport const isNodeFilledByUser = positionalRecordGetter({\n getter: ({ record, node }: RecordParams & { node: ArenaRecordNode }): boolean =>\n !!findDescendantOrSelf({ node, predicate: (visitedNode) => Nodes.hasUserInputValue(visitedNode) })(record),\n isPositional: isRecordNode,\n toParams: (node: ArenaRecordNode) => ({ node }),\n})\n\nexport const isNodeEmpty = positionalRecordGetter({\n getter: ({ record, node }: RecordParams & { node: ArenaRecordNode }): boolean =>\n !isNodeFilledByUser({ node })(record),\n isPositional: isRecordNode,\n toParams: (node: ArenaRecordNode) => ({ node }),\n})\n\nexport const isEmpty = (record: ArenaRecord): boolean => {\n const rootNode = getRoot(record)\n return rootNode ? isNodeEmpty({ node: rootNode })(record) : true\n}\n\nexport const getStep = (record: ArenaRecord): string => record.step ?? RECORD_STEP_DEFAULT\n\nexport const isInAnalysisStep = (record: ArenaRecord): boolean => getStep(record) === RecordStepAnalysisCode\n"]}
1
+ {"version":3,"file":"recordGetters.js","sourceRoot":"","sources":["../../../../src/record/_records/recordGetters.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAc,cAAc,EAAE,MAAM,cAAc,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAgC,KAAK,EAAY,MAAM,YAAY,CAAA;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAwD,QAAQ,EAAe,MAAM,eAAe,CAAA;AAC3G,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEpD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAe,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAc/D,MAAM,cAAc,GAAG,CAAC,MAAc,EAA0B,EAAE,CAAC,QAAQ,IAAI,MAAM,CAAA;AAErF,MAAM,YAAY,GAAG,CAA4B,MAAwB,EAAsB,EAAE,CAC/F,CAAC,CAAC,MAA6B,EAAE,EAAE,CACjC,cAAc,CAAC,MAAM,CAAC;IACpB,CAAC,CAAC,MAAM,CAAC,MAAW,CAAC;IACrB,CAAC,CAAC,CAAC,MAAmB,EAAE,EAAE,CAAC,MAAM,CAAC,gCAAK,MAAM,KAAE,MAAM,GAAO,CAAC,CAAuB,CAAA;AAY1F,MAAM,sBAAsB,GAAG,CAA4B,MAI1D,EAAmC,EAAE;IACpC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAA;IACjD,OAAO,CAAC,CAAC,GAAG,IAAe,EAAE,EAAE;QAC7B,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAI,IAAU,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,CAAC,CAAO,CAAA;QACtF,OAAO,CAAC,MAAmB,EAAE,EAAE,CAAC,MAAM,iCAAM,YAAY,KAAE,MAAM,IAAG,CAAA;IACrE,CAAC,CAAoC,CAAA;AACvC,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,CAAC,GAAY,EAA0B,EAAE,CAC5D,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,MAAM,IAAI,GAAG,IAAI,aAAa,IAAI,GAAG,CAAA;AAClF,MAAM,QAAQ,GAAG,CAAC,GAAY,EAAiB,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAA;AAEzE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,MAAmB,EAAU,EAAE,wBAAC,MAAM,CAAC,KAAK,mCAAI,YAAY,GAAA,CAAA;AAErF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,MAAmB,EAA+B,EAAE,wBAAC,MAAM,CAAC,KAAK,mCAAI,EAAE,GAAA,CAAA;AAEhG,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAmB,EAAqB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;AAExG;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,sBAAsB,CAAC;IAClD,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAmC,EAA+B,EAAE,kBAAC,MAAA,MAAM,CAAC,KAAK,0CAAG,IAAI,CAAC,GAAA;IAChH,YAAY,EAAE,QAAQ;IACtB,QAAQ,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;CACvC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,sBAAsB,CAAC;IACpD,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAsC,EAAqB,EAAE,CACnF,KAAK,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE,kBAAC,MAAA,MAAM,CAAC,KAAK,0CAAG,IAAI,CAAC,GAAA,CAAsB;IACxE,YAAY,EAAE,KAAK,CAAC,OAAO;IAC3B,QAAQ,EAAE,CAAC,KAAe,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;CAC3C,CAAC,CAAA;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,MAAmB,EAA+B,EAAE;IAC1E,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,sBAAsB,CAAC,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACvG,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,aAAa,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IAClD,CAAC;IACD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;AAC/D,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,sBAAsB,CAAC;IAChD,MAAM,EAAE,CAAC,EACP,MAAM,EACN,UAAU,EACV,YAAY,GAC0D,EAAqB,EAAE;QAC7F,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,MAAM,aAAa,GAAG,YAAY;gBAChC,CAAC,CAAC,sBAAsB,CAAC,+BAA+B,CAAC;oBACrD,cAAc,EAAE,UAAU,CAAC,IAAI;oBAC/B,YAAY;iBACb,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;gBACxB,CAAC,CAAC,sBAAsB,CAAC,oBAAoB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;YACpF,OAAO,eAAe,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;QAC1D,CAAC;QACD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,CACjC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,IAAI,YAAY,CAAC,CACrG,CAAA;IACH,CAAC;IACD,YAAY,EAAE,YAAY;IAC1B,QAAQ,EAAE,CAAC,UAA2B,EAAE,YAAqB,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;CACjG,CAAC,CAAA;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,sBAAsB,CAAC;IAC7C,MAAM,EAAE,CAAC,EACP,MAAM,EACN,UAAU,EACV,YAAY,GACyD,EAA+B,EAAE;QACtG,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;QAClE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,WAAW,GAAG,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,CAAA;YAC9F,MAAM,IAAI,WAAW,CAAC,uCAAuC,EAAE,WAAW,CAAC,CAAA;QAC7E,CAAC;QACD,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC;IACD,YAAY,EAAE,YAAY;IAC1B,QAAQ,EAAE,CAAC,UAA2B,EAAE,YAAoB,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;CAChG,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,sBAAsB,CAAC;IAC9C,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAA4C,EAA+B,EAAE,CAClG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;IAChF,YAAY,EAAE,YAAY;IAC1B,QAAQ,EAAE,CAAC,IAAqB,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;CAChD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;IACtD,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAA0C,EAAqB,EAAE;QAC7F,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,sBAAsB,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;YAC3F,OAAO,eAAe,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;QACtD,CAAC;QACD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,KAAK,WAAW,CAAC,CAAA;IACjF,CAAC;IACD,YAAY,EAAE,QAAQ;IACtB,QAAQ,EAAE,CAAC,WAAmB,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;CACrD,CAAC,CAAA;AAEF,MAAM,cAAc,GAAG,CAAC,eAA0E,EAAE,EAAE,CACpG,YAAY,CAAC,CAAC,MAAgD,EAAW,EAAE;IACzE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;IAC/B,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAA;QACjC,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QACtC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC;YAAE,OAAO,KAAK,CAAA;IAC/D,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;AACrH,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;AACjH,MAAM,CAAC,MAAM,aAAa,GAAG,cAAc,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;AAE/G,MAAM,CAAC,MAAM,0BAA0B,GAAG,sBAAsB,CAAC;IAC/D,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAA4C,EAAqB,EAAE;QACxF,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,sBAAsB,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;YACjG,OAAO,eAAe,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;QACtD,CAAC;QACD,MAAM,IAAI,WAAW,CAAC,iCAAiC,CAAC,CAAA;IAC1D,CAAC;IACD,YAAY,EAAE,YAAY;IAC1B,QAAQ,EAAE,CAAC,IAAqB,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;CAChD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,sBAAsB,GACjC,CAAC,MAA6D,EAAE,EAAE,CAClE,CAAC,MAAmB,EAA+B,EAAE;IACnD,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;IAEtC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAChE,IAAI,CAAC,iBAAiB;QAAE,OAAO,SAAS,CAAA;IAExC,MAAM,SAAS,GAAG,mBAAmB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IACnE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;QAC/F,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAEH,YAAY;AAEZ;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,sBAAsB,CAAC;IAC1D,MAAM,EAAE,CAAC,EACP,MAAM,EACN,IAAI,EACJ,OAAO,GACsF,EAAQ,EAAE;QACvG,IAAI,WAAW,GAAgC,IAAI,CAAA;QACnD,OAAO,WAAW,EAAE,CAAC;YACnB,IAAI,OAAO,CAAC,WAAW,CAAC;gBAAE,OAAM;YAChC,WAAW,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;QACxD,CAAC;IACH,CAAC;IACD,YAAY,EAAE,YAAY;IAC1B,8DAA8D;IAC9D,QAAQ,EAAE,CAAC,IAAqB,EAAE,OAAwC,EAAE,QAAwB,EAAE,EAAE,CAAC,CAAC;QACxG,IAAI;QACJ,OAAO,EAAE,CAAC,WAA4B,EAAW,EAAE;YACjD,OAAO,CAAC,WAAW,CAAC,CAAA;YACpB,OAAO,CAAC,EAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,EAAI,CAAA,CAAA;QACvB,CAAC;KACF,CAAC;CACH,CAAC,CAAA;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GACvB,CAAC,MAAgF,EAAE,EAAE,CACrF,CAAC,MAAmB,EAA+B,EAAE;IACnD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,CAAA;IAClC,IAAI,MAAM,GAAgC,SAAS,CAAA;IACnD,qBAAqB,CAAC;QACpB,IAAI;QACJ,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE;YACvB,IAAI,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC3B,MAAM,GAAG,WAAW,CAAA;gBACpB,OAAO,IAAI,CAAA;YACb,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC;KACF,CAAC,CAAC,MAAM,CAAC,CAAA;IACV,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CACrC,CAAC,MAA+E,EAA+B,EAAE;IAC/G,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,MAAM,CAAA;IAChD,IAAI,IAAI,CAAC,WAAW,KAAK,eAAe;QAAE,OAAO,IAAI,CAAA;IAErD,IAAI,QAAQ,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IAC1C,OAAO,QAAQ,IAAI,QAAQ,CAAC,WAAW,KAAK,eAAe,EAAE,CAAC;QAC5D,QAAQ,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IAClD,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC,CACF,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAC7C,CAAC,MAAsD,EAA0B,EAAE;IACjF,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;IAC/B,MAAM,SAAS,GAA2B,EAAE,CAAA;IAC5C,qBAAqB,CAAC;QACpB,IAAI;QACJ,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE;YACvB,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC7B,CAAC;KACF,CAAC,CAAC,MAAM,CAAC,CAAA;IACV,OAAO,SAAS,CAAA;AAClB,CAAC,CACF,CAAA;AAED,cAAc;AAEd,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAC9C,CAAC,MAAuF,EAAqB,EAAE;IAC7G,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAAA;IAElD,IAAI,iBAAiB,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW;QAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IAE9D,MAAM,8BAA8B,GAAG,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAA;IAE5F,oIAAoI;IACpI,MAAM,sBAAsB,GAAG,8BAA8B,CAAC,KAAK,CACjE,8BAA8B,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAC7D,CAAA;IACD,yGAAyG;IACzG,IAAI,gBAAgB,GAAG,CAAC,IAAI,CAAC,CAAA;IAC7B,IAAI,kBAAkB,GAAsB,EAAE,CAAA;IAC9C,KAAK,MAAM,wBAAwB,IAAI,sBAAsB,EAAE,CAAC;QAC9D,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE,CAAC;YAC/C,kBAAkB,CAAC,IAAI,CACrB,GAAG,WAAW,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,YAAY,EAAE,wBAAwB,EAAE,CAAC,CAAC,MAAM,CAAC,CAChG,CAAA;QACH,CAAC;QACD,gBAAgB,GAAG,kBAAkB,CAAA;QACrC,kBAAkB,GAAG,EAAE,CAAA;IACzB,CAAC;IACD,OAAO,gBAAgB,CAAA,CAAC,wEAAwE;AAClG,CAAC,CACF,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CACvC,CAAC,MAIA,EAA+B,EAAE;IAChC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAAA;IAElD,OAAO,oBAAoB,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AACrE,CAAC,CACF,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAA4D,EAAW,EAAE;IACtG,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAA;IACjC,OAAO,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;AACzD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,YAAY,CACjD,CAAC,MAKA,EAAQ,EAAE;IACT,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,MAAM,CAAA;IAE7E,IAAI,cAAc,KAAK,cAAc,CAAC,GAAG,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAA;QAEzB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAEnB,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YACxB,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,EAAE,CAAA;YAEnC,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;gBACzB,+BAA+B;gBAC/B,OAAM;YACR,CAAC;YAED,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;YACjD,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,EAAE,CAAA;QAEhB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEhB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,EAAqB,CAAA;YAElD,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;gBACzB,+BAA+B;gBAC/B,OAAM;YACR,CAAC;YAED,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;YAEjE,yCAAyC;YACzC,KAAK,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC1D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;gBAC7B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACnB,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC,CACF,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAC/B,CAAC,MAAgF,EAAE,EAAE,CACrF,CAAC,MAAmB,EAA+B,EAAE;IACnD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,CAAA;IAClC,IAAI,KAAK,GAAG,SAAS,CAAA;IAErB,uBAAuB,CAAC;QACtB,IAAI;QACJ,OAAO,EAAE,CAAC,WAAW,EAAE,EAAE;YACvB,IAAI,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC3B,KAAK,GAAG,WAAW,CAAA;gBACnB,OAAO,IAAI,CAAA;YACb,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC;KACF,CAAC,CAAC,MAAM,CAAC,CAAA;IACV,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAEH,MAAM,sBAAsB,GAAG,YAAY,CACzC,CAAC,MAMA,EAA+B,EAAE;IAChC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,MAAM,CAAA;IAEtE,0EAA0E;IAC1E,6EAA6E;IAC7E,uDAAuD;IACvD,iHAAiH;IACjH,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,EAAE,CAAC;QACvC,OAAO,qBAAqB,CAAC,oBAAoB,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;YAC5E,CAAC,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAC7B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACrB,CAAC;IACD,6BAA6B;IAC7B,MAAM,qBAAqB,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IACnG,IAAI,CAAC,qBAAqB;QAAE,OAAO,SAAS,CAAA;IAE5C,6CAA6C;IAC7C,OAAO,WAAW,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,qBAAqB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;AAC9E,CAAC,CACF,CAAA;AAUD,MAAM,CAAC,MAAM,0BAA0B,GAAG,YAAY,CAAC,CAAC,MAAkC,EAAY,EAAE;IACtG,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;IACzD,MAAM,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;IAC9E,MAAM,WAAW,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;IACjF,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,GAAa,EAAE,UAAU,EAAE,EAAE;QACtD,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;QACtF,kDAAkD;QAClD,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,OAA0B,CAAA;QACjD,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,EAAE,CAAC,CAAA;AACR,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAC3C,CAAC,EAAsD,EAAqB,EAAE;QAA7E,EAAE,MAAM,OAA8C,EAAzC,WAAW,cAAxB,UAA0B,CAAF;IACvB,OAAA,MAAM,CAAC,MAAM,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;AAClE,CAAC,AADiE,CACjE,CAAA;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,YAAY,CAAC,CAAC,MAAkC,EAAmB,EAAE;IAC9G,MAAM,EAAE,MAAM,KAAqB,MAAM,EAAtB,WAAW,UAAK,MAAM,EAAnC,UAA0B,CAAS,CAAA;IACzC,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;IACzE,OAAO,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,GAAoB,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE;QACxF,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,CAAA;QAC1B,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,EAAE,CAAC,CAAA;AACR,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC,CAAC,EAAsD,EAAS,EAAE;QAAjE,EAAE,MAAM,OAA8C,EAAzC,WAAW,cAAxB,UAA0B,CAAF;IACtE,OAAA,MAAM,CAAC,MAAM,CAAC,2BAA2B,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;AACjE,CAAC,AADgE,CAChE,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAC3C,CAAC,MAA+E,EAAE,EAAE;IAClF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,KAAK,EAAE,GAAG,MAAM,CAAA;IACtD,MAAM,YAAY,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IACxD,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,CAAA;IAC5B,MAAM,eAAe,GAAG,WAAW,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IAC3G,OAAO,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;AAC9G,CAAC,CACF,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAC9C,CAAC,MAAmG,EAAE,EAAE;IACtG,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;IACxC,MAAM,YAAY,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IAChD,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,CAAA;IAC5B,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IACjF,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC,WAA8B,EAAE,aAAa,EAAE,EAAE;QACpF,WAAW,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;QACnG,OAAO,WAAW,CAAA;IACpB,CAAC,EAAE,EAAE,CAAC,CAAA;AACR,CAAC,CACF,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,MAAsD,EAAE,EAAE;IAClG,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;IAC/B,MAAM,YAAY,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IAChD,IAAI,CAAC,YAAY;QAAE,OAAO,CAAC,CAAA,CAAC,cAAc;IAC1C,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IAClG,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAC/B,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAC/C,CAAC,MAOA,EAA+B,EAAE;IAChC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAAA;IACzF,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAA;IAC3E,MAAM,eAAe,GAAG,WAAW,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IACtG,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,OAAO,eAAe,CAAC,CAAC,CAAC,CAAA;IAC3B,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;IAE7E,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE;QAC5C,MAAM,+BAA+B,GAAG,2BAA2B,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAC7G,MAAM,CACP,CAAA;QACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE;YAC9B,MAAM,QAAQ,GAAG,+BAA+B,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YAC7D,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACtD,OAAO,UAAU,CAAC,YAAY,CAAC;gBAC7B,MAAM;gBACN,OAAO,EAAE,MAAM;gBACf,KAAK,EAAE,QAAQ;gBACf,WAAW,EAAE,cAAc;aAC5B,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CACF,CAAA;AAED,MAAM,CAAC,MAAM,qCAAqC,GAAG,YAAY,CAC/D,CAAC,MAMA,EAA+B,EAAE;IAChC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAA;IACjE,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IAC1D,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IAE7B,IAAI,8BAA8B,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IACzD,IAAI,CAAC,8BAA8B;QAAE,OAAO,SAAS,CAAA;IAErD,MAAM,sBAAsB,GAAG,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IAC5E,MAAM,uBAAuB,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACxE,aAAa,EAAE,QAAQ,CAAC,WAAW;QACnC,kBAAkB,EAAE,2BAA2B,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;KACtF,CAAC,CAAC,CAAA;IAEH,MAAM,8BAA8B,GAAG,CAAC,GAAG,uBAAuB,CAAC,CAAC,OAAO,EAAE,CAAA;IAE7E,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,8BAA8B,IAAI,KAAK,GAAG,8BAA8B,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAC7G,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,8BAA8B,CAAC,KAAK,CAAC,CAAA;QACnF,8BAA8B,GAAG,qBAAqB,CAAC;YACrD,MAAM;YACN,KAAK;YACL,YAAY,EAAE,8BAA8B;YAC5C,aAAa;YACb,kBAAkB;SACnB,CAAC,CAAC,WAAW,CAAC,CAAA;IACjB,CAAC;IACD,OAAO,8BAA8B,CAAA;AACvC,CAAC,CACF,CAAA;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,YAAY,CAClD,CAAC,MAOA,EAAE,EAAE;IACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,GAAG,KAAK,EAAE,QAAQ,GAAG,IAAI,EAAE,GAAG,MAAM,CAAA;IAC7F,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;IACvE,MAAM,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAA;IAC3F,MAAM,YAAY,GAAuB,EAAE,CAAA;IAE3C,MAAM,iBAAiB,GAAG,CAAC,WAAwB,EAAQ,EAAE;QAC3D,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/C,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAChC,CAAC;IACH,CAAC,CAAA;IAED,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,8BAA8B;QAC9B,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;QAC1G,IAAI,CAAC,kBAAkB;YAAE,SAAQ;QAEjC,MAAM,sBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAA;QAC1F,IAAI,CAAC,sBAAsB;YAAE,MAAM,IAAI,WAAW,CAAC,+CAA+C,CAAC,CAAA;QAEnG,qFAAqF;QACrF,MAAM,qBAAqB,GAAG,oBAAoB,CAAC;YACjD,IAAI,EAAE,kBAAkB;YACxB,iBAAiB,EAAE,sBAAsB;SAC1C,CAAC,CAAC,MAAM,CAAC,CAAA;QAEV,KAAK,MAAM,oBAAoB,IAAI,qBAAqB,EAAE,CAAC;YACzD,iBAAiB,CAAC;gBAChB,OAAO,EAAE,oBAAoB;gBAC7B,OAAO,EAAE,YAAY;aACtB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,UAAU,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;QAC9C,IAAI,UAAU,EAAE,CAAC;YACf,iBAAiB,CAAC;gBAChB,OAAO,EAAE,UAAU;gBACnB,OAAO;aACR,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAA;AACrB,CAAC,CACF,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAC7C,CAAC,MAKA,EAAY,EAAE;IACb,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;IAEtD,MAAM,wBAAwB,GAAG,CAAC,aAA0C,EAAU,EAAE;;QACtF,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACtF,IAAI,CAAC,YAAY;YAAE,OAAO,EAAE,CAAA;QAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAA;QAC9E,aAAO,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,CAAC,IAAI,mCAAI,EAAE,CAAA;IAC/B,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,EAAE,CAAA;IACpB,IAAI,0BAA0B,GAAG,sBAAsB,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IAExF,OAAO,0BAA0B,EAAE,CAAC;QAClC,MAAM,gBAAgB,GAAG,wBAAwB,CAAC,0BAA0B,CAAC,CAAA;QAC7E,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;QACnC,MAAM,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAC/C,MAAM;YACN,IAAI,EAAE,0BAA0B,CAAC,WAAW;SAC7C,CAAgB,CAAA;QACjB,0BAA0B,GAAG,sBAAsB,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IACvG,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC,CACF,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAC7C,CAAC,MAMA,EAAsB,EAAE;IACvB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;IAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAA;IAE/C,MAAM,SAAS,GAAG,CAAC,GAAG,mBAAmB,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAA;IAEzF,MAAM,IAAI,GAAG,OAAO,CAAC,0BAA0B,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAA;IAEpF,OAAO,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAA;AACnB,CAAC,CACF,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,sBAAsB,CAAC;IACvD,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAA4C,EAAW,EAAE,CAC9E,CAAC,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IAC5G,YAAY,EAAE,YAAY;IAC1B,QAAQ,EAAE,CAAC,IAAqB,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;CAChD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,sBAAsB,CAAC;IAChD,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAA4C,EAAW,EAAE,CAC9E,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IACvC,YAAY,EAAE,YAAY;IAC1B,QAAQ,EAAE,CAAC,IAAqB,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;CAChD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,MAAmB,EAAW,EAAE;IACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAChC,OAAO,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAClE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,MAAmB,EAAU,EAAE,wBAAC,MAAM,CAAC,IAAI,mCAAI,mBAAmB,GAAA,CAAA;AAE1F,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAmB,EAAW,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,sBAAsB,CAAA","sourcesContent":["import { Dictionary, TraverseMethod } from '../../common'\nimport { SystemError } from '../../error'\nimport { ArenaRecordNode, NodePointer, Nodes, NodesMap } from '../../node'\nimport { NodeValues } from '../../node/nodeValues'\nimport { NodeDef, NodeDefCode, NodeDefCodeProps, NodeDefProps, NodeDefs, NodeDefType } from '../../nodeDef'\nimport { defaultCycle, Surveys } from '../../survey'\nimport { Survey, SurveyDependencyType } from '../../survey/survey'\nimport { Arrays, Queue } from '../../utils'\nimport { ArenaRecord, RECORD_STEP_DEFAULT } from '../record'\nimport { RecordStepAnalysisCode } from '../recordStep'\nimport { RecordNodesIndexReader } from './recordNodesIndexReader'\nimport { NodeDefSelfReferences } from './nodeDefSelfReferences'\n\nexport type RecordParams = { record: ArenaRecord }\n\n/**\n * Record getter: takes the parameters first and the record as separate (curried) parameter: `getter(params)(record)`.\n * The deprecated form, with the record inside the parameters (`getter({ record, ...params })`), is still supported.\n */\nexport type RecordGetter<P extends RecordParams, R> = {\n /** @deprecated Pass the record as separate parameter: `getter(params)(record)` */\n (params: P): R\n (params: Omit<P, 'record'>): (record: ArenaRecord) => R\n}\n\nconst isRecordParams = (params: object): params is RecordParams => 'record' in params\n\nconst recordGetter = <P extends RecordParams, R>(getter: (params: P) => R): RecordGetter<P, R> =>\n ((params: P | Omit<P, 'record'>) =>\n isRecordParams(params)\n ? getter(params as P)\n : (record: ArenaRecord) => getter({ ...params, record } as P)) as RecordGetter<P, R>\n\n/**\n * Record getter (with parameters object) that also supports the deprecated form with positional parameters:\n * `getter(arg1, arg2)(record)`.\n */\nexport type PositionalRecordGetter<P, A extends unknown[], R> = {\n (params: P): (record: ArenaRecord) => R\n /** @deprecated Pass the parameters as an object: `getter({ ...params })(record)` */\n (...args: A): (record: ArenaRecord) => R\n}\n\nconst positionalRecordGetter = <P, A extends unknown[], R>(params: {\n getter: (params: P & RecordParams) => R\n isPositional: (firstArg: unknown) => boolean\n toParams: (...args: A) => NoInfer<P>\n}): PositionalRecordGetter<P, A, R> => {\n const { getter, isPositional, toParams } = params\n return ((...args: unknown[]) => {\n const getterParams = isPositional(args[0]) ? toParams(...(args as A)) : (args[0] as P)\n return (record: ArenaRecord) => getter({ ...getterParams, record })\n }) as PositionalRecordGetter<P, A, R>\n}\n\nconst isRecordNode = (arg: unknown): arg is ArenaRecordNode =>\n typeof arg === 'object' && arg !== null && 'uuid' in arg && 'nodeDefUuid' in arg\nconst isString = (arg: unknown): arg is string => typeof arg === 'string'\n\nexport const getCycle = (record: ArenaRecord): string => record.cycle ?? defaultCycle\n\nexport const getNodes = (record: ArenaRecord): Dictionary<ArenaRecordNode> => record.nodes ?? {}\n\nexport const getNodesArray = (record: ArenaRecord): ArenaRecordNode[] => Object.values(getNodes(record))\n\n/**\n * Returns the node with the specified uuid, or undefined if not found.\n * Like the other node getters, it does not throw an error when the node is not found.\n */\nexport const getNodeByUuid = positionalRecordGetter({\n getter: ({ record, uuid }: RecordParams & { uuid: string }): ArenaRecordNode | undefined => record.nodes?.[uuid],\n isPositional: isString,\n toParams: (uuid: string) => ({ uuid }),\n})\n\nexport const getNodesByUuids = positionalRecordGetter({\n getter: ({ record, uuids }: RecordParams & { uuids: string[] }): ArenaRecordNode[] =>\n uuids.map((uuid: string) => record.nodes?.[uuid]) as ArenaRecordNode[],\n isPositional: Array.isArray,\n toParams: (uuids: string[]) => ({ uuids }),\n})\n\n/**\n * Returns the root node, or undefined if the record has no nodes.\n */\nexport const getRoot = (record: ArenaRecord): ArenaRecordNode | undefined => {\n const rootUuid = record._nodesIndex ? RecordNodesIndexReader.getNodeRootUuid(record._nodesIndex) : null\n if (rootUuid) {\n return getNodeByUuid({ uuid: rootUuid })(record)\n }\n return getNodesArray(record).find((node) => !node.parentUuid)\n}\n\nexport const getChildren = positionalRecordGetter({\n getter: ({\n record,\n parentNode,\n childDefUuid,\n }: RecordParams & { parentNode: ArenaRecordNode; childDefUuid?: string }): ArenaRecordNode[] => {\n if (record._nodesIndex) {\n const childrenUuids = childDefUuid\n ? RecordNodesIndexReader.getNodeUuidsByParentAndChildDef({\n parentNodeUuid: parentNode.uuid,\n childDefUuid,\n })(record._nodesIndex)\n : RecordNodesIndexReader.getNodeUuidsByParent(parentNode.uuid)(record._nodesIndex)\n return getNodesByUuids({ uuids: childrenUuids })(record)\n }\n return getNodesArray(record).filter(\n (node) => node.parentUuid === parentNode.uuid && (!childDefUuid || node.nodeDefUuid == childDefUuid)\n )\n },\n isPositional: isRecordNode,\n toParams: (parentNode: ArenaRecordNode, childDefUuid?: string) => ({ parentNode, childDefUuid }),\n})\n\n/**\n * Returns the only child of the parent node with the specified node def, or undefined if not found.\n * Throws an error if more than one child is found.\n */\nexport const getChild = positionalRecordGetter({\n getter: ({\n record,\n parentNode,\n childDefUuid,\n }: RecordParams & { parentNode: ArenaRecordNode; childDefUuid: string }): ArenaRecordNode | undefined => {\n const children = getChildren({ parentNode, childDefUuid })(record)\n if (children.length > 1) {\n const errorParams = { childDefUuid, parentNodeUuid: parentNode.uuid, recordUuid: record.uuid }\n throw new SystemError('systemError.record.multipleNodesFound', errorParams)\n }\n return children[0]\n },\n isPositional: isRecordNode,\n toParams: (parentNode: ArenaRecordNode, childDefUuid: string) => ({ parentNode, childDefUuid }),\n})\n\nexport const getParent = positionalRecordGetter({\n getter: ({ record, node }: RecordParams & { node: ArenaRecordNode }): ArenaRecordNode | undefined =>\n node.parentUuid ? getNodeByUuid({ uuid: node.parentUuid })(record) : undefined,\n isPositional: isRecordNode,\n toParams: (node: ArenaRecordNode) => ({ node }),\n})\n\nexport const getNodesByDefUuid = positionalRecordGetter({\n getter: ({ record, nodeDefUuid }: RecordParams & { nodeDefUuid: string }): ArenaRecordNode[] => {\n if (record._nodesIndex) {\n const nodeUuids = RecordNodesIndexReader.getNodeUuidsByDef(nodeDefUuid)(record._nodesIndex)\n return getNodesByUuids({ uuids: nodeUuids })(record)\n }\n return getNodesArray(record).filter((node) => node.nodeDefUuid === nodeDefUuid)\n },\n isPositional: isString,\n toParams: (nodeDefUuid: string) => ({ nodeDefUuid }),\n})\n\nconst isNodeFlagTrue = (isChildFlagTrue: (parent: ArenaRecordNode, nodeDefUuid: string) => boolean) =>\n recordGetter((params: RecordParams & { node: ArenaRecordNode }): boolean => {\n const { record, node } = params\n const ancestorsAndSelf = getAncestorsAndSelf({ node })(record)\n for (let i = 0; i < ancestorsAndSelf.length - 1; i++) {\n const child = ancestorsAndSelf[i]\n const parent = ancestorsAndSelf[i + 1]\n if (!isChildFlagTrue(parent, child.nodeDefUuid)) return false\n }\n return true\n })\n\nexport const isNodeApplicable = isNodeFlagTrue((parent, nodeDefUuid) => Nodes.isChildApplicable(parent, nodeDefUuid))\nexport const isNodeEditable = isNodeFlagTrue((parent, nodeDefUuid) => Nodes.isChildEditable(parent, nodeDefUuid))\nexport const isNodeVisible = isNodeFlagTrue((parent, nodeDefUuid) => Nodes.isChildVisible(parent, nodeDefUuid))\n\nexport const getDependentCodeAttributes = positionalRecordGetter({\n getter: ({ record, node }: RecordParams & { node: ArenaRecordNode }): ArenaRecordNode[] => {\n if (record._nodesIndex) {\n const nodeUuids = RecordNodesIndexReader.getNodeCodeDependentUuids(node.uuid)(record._nodesIndex)\n return getNodesByUuids({ uuids: nodeUuids })(record)\n }\n throw new SystemError('record.nodesIndexNotInitialized')\n },\n isPositional: isRecordNode,\n toParams: (node: ArenaRecordNode) => ({ node }),\n})\n\nexport const getParentCodeAttribute =\n (params: { parentNode: ArenaRecordNode; nodeDef: NodeDefCode }) =>\n (record: ArenaRecord): ArenaRecordNode | undefined => {\n const { parentNode, nodeDef } = params\n\n const parentCodeDefUuid = NodeDefs.getParentCodeDefUuid(nodeDef)\n if (!parentCodeDefUuid) return undefined\n\n const ancestors = getAncestorsAndSelf({ node: parentNode })(record)\n for (const ancestor of ancestors) {\n const children = getChildren({ parentNode: ancestor, childDefUuid: parentCodeDefUuid })(record)\n if (children.length === 1) {\n return children[0]\n }\n }\n return undefined\n }\n\n// ancestors\n\n/**\n * Visits the specified node and its ancestors, from the node up to the root: the visit stops when the visitor returns true.\n */\nexport const visitAncestorsAndSelf = positionalRecordGetter({\n getter: ({\n record,\n node,\n visitor,\n }: RecordParams & { node: ArenaRecordNode; visitor: (node: ArenaRecordNode) => boolean | void }): void => {\n let currentNode: ArenaRecordNode | undefined = node\n while (currentNode) {\n if (visitor(currentNode)) return\n currentNode = getParent({ node: currentNode })(record)\n }\n },\n isPositional: isRecordNode,\n // deprecated form: the visit stops when stopIfFn returns true\n toParams: (node: ArenaRecordNode, visitor: (node: ArenaRecordNode) => void, stopIfFn?: () => boolean) => ({\n node,\n visitor: (visitedNode: ArenaRecordNode): boolean => {\n visitor(visitedNode)\n return !!stopIfFn?.()\n },\n }),\n})\n\n/**\n * Returns the first node satisfying the predicate among the specified node and its ancestors (from the node up to the root).\n */\nexport const findAncestor =\n (params: { node: ArenaRecordNode; predicate: (node: ArenaRecordNode) => boolean }) =>\n (record: ArenaRecord): ArenaRecordNode | undefined => {\n const { node, predicate } = params\n let result: ArenaRecordNode | undefined = undefined\n visitAncestorsAndSelf({\n node,\n visitor: (visitedNode) => {\n if (predicate(visitedNode)) {\n result = visitedNode\n return true\n }\n return false\n },\n })(record)\n return result\n }\n\n/**\n * Returns the specified node, if it has the specified node def, or its ancestor with that node def; undefined if not found.\n */\nexport const getAncestor = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode; ancestorDefUuid: string }): ArenaRecordNode | undefined => {\n const { record, node, ancestorDefUuid } = params\n if (node.nodeDefUuid === ancestorDefUuid) return node\n\n let ancestor = getParent({ node })(record)\n while (ancestor && ancestor.nodeDefUuid !== ancestorDefUuid) {\n ancestor = getParent({ node: ancestor })(record)\n }\n return ancestor\n }\n)\n\n/**\n * Returns the list of ancestors from the given node to the root entity\n */\nexport const getAncestorsAndSelf = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode }): Array<ArenaRecordNode> => {\n const { record, node } = params\n const ancestors: Array<ArenaRecordNode> = []\n visitAncestorsAndSelf({\n node,\n visitor: (currentNode) => {\n ancestors.push(currentNode)\n },\n })(record)\n return ancestors\n }\n)\n\n// descendants\n\nexport const getDescendantsOrSelf = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode; nodeDefDescendant: NodeDef<any> }): ArenaRecordNode[] => {\n const { record, node, nodeDefDescendant } = params\n\n if (nodeDefDescendant.uuid === node.nodeDefUuid) return [node]\n\n const nodeDefDescendantFullHierarchy = [...nodeDefDescendant.meta.h, nodeDefDescendant.uuid]\n\n // 1. get the descendant node defs uuids starting from node nodeDefUuid (not inclusive) down to the specified nodeDefDescendant uuid\n const descendantNodeDefUuids = nodeDefDescendantFullHierarchy.slice(\n nodeDefDescendantFullHierarchy.indexOf(node.nodeDefUuid) + 1\n )\n // 2. for every level in the hierarchy, find the children having the nodeDefUuid equal to the current one\n let currentAncestors = [node]\n let currentDescendants: ArenaRecordNode[] = []\n for (const currentDescendantDefUuid of descendantNodeDefUuids) {\n for (const currentAncestor of currentAncestors) {\n currentDescendants.push(\n ...getChildren({ parentNode: currentAncestor, childDefUuid: currentDescendantDefUuid })(record)\n )\n }\n currentAncestors = currentDescendants\n currentDescendants = []\n }\n return currentAncestors // currentAncestors is equal to the currentDescendants of the last level\n }\n)\n\n/**\n * Returns the first descendant (or the node itself) with the specified node def, or undefined if not found.\n */\nexport const getDescendant = recordGetter(\n (params: {\n record: ArenaRecord\n node: ArenaRecordNode\n nodeDefDescendant: NodeDef<any>\n }): ArenaRecordNode | undefined => {\n const { record, node, nodeDefDescendant } = params\n\n return getDescendantsOrSelf({ node, nodeDefDescendant })(record)[0]\n }\n)\n\nexport const isDescendantOf = (params: { node: ArenaRecordNode; ancestor: ArenaRecordNode }): boolean => {\n const { node, ancestor } = params\n return Nodes.getHierarchy(node).includes(ancestor.uuid)\n}\n\nexport const visitDescendantsAndSelf = recordGetter(\n (params: {\n record: ArenaRecord\n node: ArenaRecordNode\n visitor: (node: ArenaRecordNode) => boolean | void\n traverseMethod?: TraverseMethod\n }): void => {\n const { record, node, visitor, traverseMethod = TraverseMethod.bfs } = params\n\n if (traverseMethod === TraverseMethod.bfs) {\n const queue = new Queue()\n\n queue.enqueue(node)\n\n while (!queue.isEmpty()) {\n const visitedNode = queue.dequeue()\n\n if (visitor(visitedNode)) {\n // stop if visitor returns true\n return\n }\n\n const children = getChildren(visitedNode)(record)\n queue.enqueueItems(children)\n }\n } else {\n const stack = []\n\n stack.push(node)\n\n while (stack.length > 0) {\n const visitedNode = stack.pop() as ArenaRecordNode\n\n if (visitor(visitedNode)) {\n // stop if visitor returns true\n return\n }\n\n const children = getChildren({ parentNode: visitedNode })(record)\n\n // add children to stack in reverse order\n for (let index = children.length - 1; index >= 0; index--) {\n const child = children[index]\n stack.push(child)\n }\n }\n }\n }\n)\n\nexport const findDescendantOrSelf =\n (params: { node: ArenaRecordNode; predicate: (node: ArenaRecordNode) => boolean }) =>\n (record: ArenaRecord): ArenaRecordNode | undefined => {\n const { node, predicate } = params\n let found = undefined\n\n visitDescendantsAndSelf({\n node,\n visitor: (currentNode) => {\n if (predicate(currentNode)) {\n found = currentNode\n return true\n }\n return false\n },\n })(record)\n return found\n }\n\nconst getClosestAncestorNode = recordGetter(\n (params: {\n record: ArenaRecord\n node: ArenaRecordNode\n nodeDef: NodeDef<NodeDefType, NodeDefProps>\n dependentDef: NodeDef<NodeDefType, NodeDefProps>\n dependencyType: SurveyDependencyType\n }): ArenaRecordNode | undefined => {\n const { record, node, nodeDef, dependentDef, dependencyType } = params\n\n // 1a if dependent def is the same as node def, potentially all nodes with\n // nodeDefUuid === dependentDef.uuid in record could be dependent of nodeDef;\n // consider the root node as the closest ancestor node,\n // unless the node def references itself only among the children of its parent entity (e.g. validation \"dbh > 0\")\n if (nodeDef.uuid === dependentDef.uuid) {\n return NodeDefSelfReferences.isSelfReferenceLocal({ nodeDef, dependencyType })\n ? getParent({ node })(record)\n : getRoot(record)\n }\n // 1 find common ancestor def\n const commonAncestorDefUuid = Arrays.last(Arrays.intersection(nodeDef.meta.h, dependentDef.meta.h))\n if (!commonAncestorDefUuid) return undefined\n\n // 2 get ancestor node with common parent def\n return getAncestor({ node, ancestorDefUuid: commonAncestorDefUuid })(record)\n }\n)\n\ntype EntityKeyNodesGetterParams = {\n survey: Survey\n cycle?: string\n record: ArenaRecord\n entity: ArenaRecordNode\n keyDefs?: NodeDef<NodeDefType, NodeDefProps>[]\n}\n\nexport const getEntityKeyNodesByDefUuid = recordGetter((params: EntityKeyNodesGetterParams): NodesMap => {\n const { survey, cycle, record, entity, keyDefs } = params\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: entity.nodeDefUuid })\n const nodeDefKeys = keyDefs ?? Surveys.getNodeDefKeys({ survey, cycle, nodeDef })\n return nodeDefKeys.reduce((acc: NodesMap, nodeDefKey) => {\n const nodeKey = getDescendant({ node: entity, nodeDefDescendant: nodeDefKey })(record)\n // missing key nodes are kept as undefined entries\n acc[nodeDefKey.uuid] = nodeKey as ArenaRecordNode\n return acc\n }, {})\n})\n\nexport const getEntityKeyNodes = recordGetter(\n ({ record, ...otherParams }: EntityKeyNodesGetterParams): ArenaRecordNode[] =>\n Object.values(getEntityKeyNodesByDefUuid(otherParams)(record))\n)\n\nexport const getEntityKeyValuesByDefUuid = recordGetter((params: EntityKeyNodesGetterParams): Dictionary<any> => {\n const { record, ...otherParams } = params\n const keyNodesByDefUuid = getEntityKeyNodesByDefUuid(otherParams)(record)\n return Object.entries(keyNodesByDefUuid).reduce((acc: Dictionary<any>, [uuid, keyNode]) => {\n acc[uuid] = keyNode?.value\n return acc\n }, {})\n})\n\nexport const getEntityKeyValues = recordGetter(({ record, ...otherParams }: EntityKeyNodesGetterParams): any[] =>\n Object.values(getEntityKeyValuesByDefUuid(otherParams)(record))\n)\n\nexport const getEntitySiblings = recordGetter(\n (params: { record: ArenaRecord; entity: ArenaRecordNode; includeSelf?: boolean }) => {\n const { record, entity, includeSelf = false } = params\n const parentEntity = getParent({ node: entity })(record)\n if (!parentEntity) return []\n const siblingEntities = getChildren({ parentNode: parentEntity, childDefUuid: entity.nodeDefUuid })(record)\n return includeSelf ? siblingEntities : siblingEntities.filter((sibling) => !Nodes.areEqual(sibling, entity))\n }\n)\n\nexport const getAttributeSiblings = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode; nodeDef: NodeDef<NodeDefType, NodeDefProps> }) => {\n const { record, node, nodeDef } = params\n const parentEntity = getParent({ node })(record)\n if (!parentEntity) return []\n const siblingParentEntities = getEntitySiblings({ entity: parentEntity })(record)\n return siblingParentEntities.reduce((siblingsAcc: ArenaRecordNode[], siblingEntity) => {\n siblingsAcc.push(...getChildren({ parentNode: siblingEntity, childDefUuid: nodeDef.uuid })(record))\n return siblingsAcc\n }, [])\n }\n)\n\nexport const getNodeIndex = recordGetter((params: { record: ArenaRecord; node: ArenaRecordNode }) => {\n const { record, node } = params\n const parentEntity = getParent({ node })(record)\n if (!parentEntity) return 0 // root entity\n const siblings = getChildren({ parentNode: parentEntity, childDefUuid: node.nodeDefUuid })(record)\n return siblings.indexOf(node)\n})\n\nexport const findEntityByKeyValues = recordGetter(\n (params: {\n survey: Survey\n cycle: string\n record: ArenaRecord\n parentEntity: ArenaRecordNode\n entityDefUuid: string\n keyValuesByDefUuid: Dictionary<any>\n }): ArenaRecordNode | undefined => {\n const { survey, cycle, record, parentEntity, entityDefUuid, keyValuesByDefUuid } = params\n const entityDef = Surveys.getNodeDefByUuid({ survey, uuid: entityDefUuid })\n const siblingEntities = getChildren({ parentNode: parentEntity, childDefUuid: entityDefUuid })(record)\n if (NodeDefs.isSingle(entityDef)) {\n return siblingEntities[0]\n }\n const keyDefs = Surveys.getNodeDefKeys({ survey, cycle, nodeDef: entityDef })\n\n return siblingEntities.find((siblingEntity) => {\n const siblingEntityKeyValuesByDefUuid = getEntityKeyValuesByDefUuid({ survey, entity: siblingEntity, keyDefs })(\n record\n )\n return keyDefs.every((keyDef) => {\n const keyValue = siblingEntityKeyValuesByDefUuid[keyDef.uuid]\n const keyValueSearch = keyValuesByDefUuid[keyDef.uuid]\n return NodeValues.isValueEqual({\n survey,\n nodeDef: keyDef,\n value: keyValue,\n valueSearch: keyValueSearch,\n })\n })\n })\n }\n)\n\nexport const findEntityWithSameKeysInAnotherRecord = recordGetter(\n (params: {\n survey: Survey\n cycle: string\n entityUuid: string\n record: ArenaRecord\n recordOther: ArenaRecord\n }): ArenaRecordNode | undefined => {\n const { survey, cycle, entityUuid, record, recordOther } = params\n const entity = getNodeByUuid({ uuid: entityUuid })(record)\n if (!entity) return undefined\n\n let otherRecordCurrentParentEntity = getRoot(recordOther)\n if (!otherRecordCurrentParentEntity) return undefined\n\n const entityAncestorsAndSelf = getAncestorsAndSelf({ node: entity })(record)\n const ancestorDefUuidsAndKeys = entityAncestorsAndSelf.map((ancestor) => ({\n entityDefUuid: ancestor.nodeDefUuid,\n keyValuesByDefUuid: getEntityKeyValuesByDefUuid({ survey, entity: ancestor })(record),\n }))\n\n const ancestorDefUuidsAndKeysToVisit = [...ancestorDefUuidsAndKeys].reverse()\n\n for (let index = 1; otherRecordCurrentParentEntity && index < ancestorDefUuidsAndKeysToVisit.length; index++) {\n const { entityDefUuid, keyValuesByDefUuid } = ancestorDefUuidsAndKeysToVisit[index]\n otherRecordCurrentParentEntity = findEntityByKeyValues({\n survey,\n cycle,\n parentEntity: otherRecordCurrentParentEntity,\n entityDefUuid,\n keyValuesByDefUuid,\n })(recordOther)\n }\n return otherRecordCurrentParentEntity\n }\n)\n\nexport const getDependentNodePointers = recordGetter(\n (params: {\n survey: Survey\n record: ArenaRecord\n node: ArenaRecordNode\n dependencyType: SurveyDependencyType\n includeSelf?: boolean\n filterFn?: (nodePointer: NodePointer) => boolean\n }) => {\n const { survey, record, node, dependencyType, includeSelf = false, filterFn = null } = params\n const nodeDefUuid = node.nodeDefUuid\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: nodeDefUuid })\n const dependentDefs = Surveys.getNodeDefDependents({ survey, nodeDefUuid, dependencyType })\n const nodePointers: Array<NodePointer> = []\n\n const addToNodePointers = (nodePointer: NodePointer): void => {\n if (filterFn === null || filterFn(nodePointer)) {\n nodePointers.push(nodePointer)\n }\n }\n\n for (const dependentDef of dependentDefs) {\n // 1 find common ancestor node\n const commonAncestorNode = getClosestAncestorNode({ node, nodeDef, dependentDef, dependencyType })(record)\n if (!commonAncestorNode) continue\n\n const nodeDefDependentParent = Surveys.getNodeDefParent({ survey, nodeDef: dependentDef })\n if (!nodeDefDependentParent) throw new SystemError('record.nodes.dependents.dependencyOnRootFound')\n\n // 2 find descendant nodes of common parent node with nodeDefUuid = dependentDef uuid\n const dependentContextNodes = getDescendantsOrSelf({\n node: commonAncestorNode,\n nodeDefDescendant: nodeDefDependentParent,\n })(record)\n\n for (const dependentContextNode of dependentContextNodes) {\n addToNodePointers({\n nodeCtx: dependentContextNode,\n nodeDef: dependentDef,\n })\n }\n }\n if (includeSelf) {\n const parentNode = getParent({ node })(record)\n if (parentNode) {\n addToNodePointers({\n nodeCtx: parentNode,\n nodeDef,\n })\n }\n }\n\n return nodePointers\n }\n)\n\nexport const getAncestorCodePath = recordGetter(\n (params: {\n survey: Survey\n record: ArenaRecord\n parentNode: ArenaRecordNode\n nodeDef: NodeDef<NodeDefType.code, NodeDefCodeProps>\n }): string[] => {\n const { record, parentNode, nodeDef, survey } = params\n\n const getCodeAttributeItemCode = (codeAttribute: ArenaRecordNode | undefined): string => {\n const codeItemUuid = codeAttribute ? NodeValues.getItemUuid(codeAttribute) : undefined\n if (!codeItemUuid) return ''\n const item = Surveys.getCategoryItemByUuid({ survey, itemUuid: codeItemUuid })\n return item?.props.code ?? ''\n }\n\n const codePaths = []\n let currentParentCodeAttribute = getParentCodeAttribute({ parentNode, nodeDef })(record)\n\n while (currentParentCodeAttribute) {\n const ancestorItemCode = getCodeAttributeItemCode(currentParentCodeAttribute)\n codePaths.unshift(ancestorItemCode)\n const ancestorCodeDef = Surveys.getNodeDefByUuid({\n survey,\n uuid: currentParentCodeAttribute.nodeDefUuid,\n }) as NodeDefCode\n currentParentCodeAttribute = getParentCodeAttribute({ parentNode, nodeDef: ancestorCodeDef })(record)\n }\n return codePaths\n }\n)\n\nexport const getCategoryItemUuid = recordGetter(\n (params: {\n survey: Survey\n nodeDef: NodeDef<NodeDefType.code, NodeDefCodeProps>\n record: ArenaRecord\n parentNode: ArenaRecordNode\n code: string\n }): string | undefined => {\n const { survey, nodeDef, record, parentNode, code } = params\n const categoryUuid = nodeDef.props.categoryUuid\n\n const codePaths = [...getAncestorCodePath({ survey, parentNode, nodeDef })(record), code]\n\n const item = Surveys.getCategoryItemByCodePaths({ survey, categoryUuid, codePaths })\n\n return item?.uuid\n }\n)\n\nexport const isNodeFilledByUser = positionalRecordGetter({\n getter: ({ record, node }: RecordParams & { node: ArenaRecordNode }): boolean =>\n !!findDescendantOrSelf({ node, predicate: (visitedNode) => Nodes.hasUserInputValue(visitedNode) })(record),\n isPositional: isRecordNode,\n toParams: (node: ArenaRecordNode) => ({ node }),\n})\n\nexport const isNodeEmpty = positionalRecordGetter({\n getter: ({ record, node }: RecordParams & { node: ArenaRecordNode }): boolean =>\n !isNodeFilledByUser({ node })(record),\n isPositional: isRecordNode,\n toParams: (node: ArenaRecordNode) => ({ node }),\n})\n\nexport const isEmpty = (record: ArenaRecord): boolean => {\n const rootNode = getRoot(record)\n return rootNode ? isNodeEmpty({ node: rootNode })(record) : true\n}\n\nexport const getStep = (record: ArenaRecord): string => record.step ?? RECORD_STEP_DEFAULT\n\nexport const isInAnalysisStep = (record: ArenaRecord): boolean => getStep(record) === RecordStepAnalysisCode\n"]}
@@ -23,8 +23,10 @@ const shouldExistingEntitiesBeDeleted = (params) => __awaiter(void 0, void 0, vo
23
23
  const enumeratorDef = Surveys.getNodeDefEnumerator({ survey, entityDef });
24
24
  const existingEnumeratingItemUuids = existingEntities
25
25
  .map((existingEntity) => {
26
+ var _a;
26
27
  const existingEnumerator = getChild({ parentNode: existingEntity, childDefUuid: enumeratorDef.uuid })(updateResult.record);
27
- return NodeValues.getItemUuid(existingEnumerator);
28
+ // an entity without enumerator item makes the lists differ, so the entities are recreated
29
+ return (_a = (existingEnumerator ? NodeValues.getItemUuid(existingEnumerator) : undefined)) !== null && _a !== void 0 ? _a : '';
28
30
  })
29
31
  .sort(uuidsCompare);
30
32
  const allowedCodes = yield getEnumeratingItemsAllowedCodes({
@@ -1 +1 @@
1
- {"version":3,"file":"recordNodeDependentsEnumeratedEntitiesUpdater.js","sourceRoot":"","sources":["../../../../src/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArenaRecordNode, Nodes, NodeValues } from '../../node'\nimport { NodeDefCode, NodeDefEntity, NodeDefType } from '../../nodeDef'\nimport { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider'\nimport { Survey, Surveys } from '../../survey'\nimport { Objects } from '../../utils'\nimport { getAncestor, getChild, getChildren } from '../_records/recordGetters'\nimport { getEnumeratingCategoryItems } from '../_records/recordUtils'\nimport { getEnumeratingItemsAllowedCodes } from './recordEnumeratingItemsExpressionEvaluator'\nimport { RecordExpressionEvaluationContext } from './recordExpressionEvaluationContext'\nimport { RecordNodeDependentsUpdateParams } from './recordNodeDependentsUpdateParams'\nimport { createEnumeratedEntityNodes } from './recordNodesCreator'\nimport { deleteNodes } from './recordNodesDeleter'\nimport { RecordUpdateResult } from './recordUpdateResult'\n\nconst uuidsCompare = (uuidA: string, uuidB: string): number => uuidA.localeCompare(uuidB)\n\nconst shouldExistingEntitiesBeDeleted = async (params: {\n survey: Survey\n entityDef: NodeDefEntity\n existingEntities: ArenaRecordNode[]\n parentNode: ArenaRecordNode\n updateResult: RecordUpdateResult\n categoryItemProvider?: CategoryItemProvider\n user: RecordExpressionEvaluationContext['user']\n}) => {\n const { survey, entityDef, existingEntities, parentNode, updateResult, categoryItemProvider, user } = params\n const enumeratorDef = Surveys.getNodeDefEnumerator({ survey, entityDef })!\n const existingEnumeratingItemUuids = existingEntities\n .map((existingEntity) => {\n const existingEnumerator = getChild({ parentNode: existingEntity, childDefUuid: enumeratorDef.uuid })(\n updateResult.record\n )\n return NodeValues.getItemUuid(existingEnumerator)!\n })\n .sort(uuidsCompare)\n\n const allowedCodes = await getEnumeratingItemsAllowedCodes({\n survey,\n user,\n record: updateResult.record,\n entityDef,\n parentNode,\n })\n\n const enumeratingCategoryItems = await getEnumeratingCategoryItems({\n survey,\n enumeratorDef,\n parentNode,\n categoryItemProvider,\n allowedCodes,\n })(updateResult.record)\n const newEnumeratingItemUuids = enumeratingCategoryItems.map((item) => item.uuid).sort(uuidsCompare)\n\n return !Objects.isEqual(newEnumeratingItemUuids, existingEnumeratingItemUuids)\n}\n\nexport const createOrDeleteEnumeratedEntities = async (\n params: RecordExpressionEvaluationContext & {\n parentNode: ArenaRecordNode\n entityDef: NodeDefEntity\n updateResult: RecordUpdateResult\n }\n) => {\n const { survey, parentNode, entityDef, categoryItemProvider, updateResult, sideEffect } = params\n const recordUpdateOptions = { sideEffect }\n const existingEntities = getChildren({ parentNode, childDefUuid: entityDef.uuid })(updateResult.record)\n const existingEntitiesCount = existingEntities.length\n const hasExistingEntities = existingEntitiesCount > 0\n const applicable = Nodes.isChildApplicable(parentNode, entityDef.uuid)\n\n const deleteExistingEntities = () => {\n const existingEntityUuids = existingEntities.map((node) => node.uuid)\n const nodesDeleteUpdatedResult = deleteNodes(existingEntityUuids, recordUpdateOptions)(updateResult.record)\n updateResult.merge(nodesDeleteUpdatedResult)\n }\n\n if (applicable) {\n if (hasExistingEntities) {\n const existingEntitiesToBeDeleted = await shouldExistingEntitiesBeDeleted({\n survey,\n entityDef,\n existingEntities,\n parentNode,\n updateResult,\n categoryItemProvider,\n user: params.user,\n })\n if (!existingEntitiesToBeDeleted) {\n // existing entities already match the enumerating items: nothing to do (do not create them again)\n return\n }\n deleteExistingEntities()\n }\n await createEnumeratedEntityNodes({ ...params, nodeDef: entityDef, parentNode })\n } else if (hasExistingEntities) {\n deleteExistingEntities()\n }\n}\n\nexport const updateDependentEnumeratedEntities = async (\n params: RecordNodeDependentsUpdateParams\n): Promise<RecordUpdateResult> => {\n const { survey, record, node } = params\n\n const updateResult = new RecordUpdateResult({ record })\n\n // 1. get dependent enumerated entities\n const { nodeDefUuid } = node\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: nodeDefUuid })\n if (nodeDef.type !== NodeDefType.code) return updateResult\n const codeDef = nodeDef as NodeDefCode\n\n const dependentEnumeratedEntityDefs = Surveys.getDependentEnumeratedEntityDefs({ survey, nodeDef: codeDef })\n if (dependentEnumeratedEntityDefs.length === 0) return updateResult\n\n const ancestorMultipleEntityDef = Surveys.getNodeDefAncestorMultipleEntity({ survey, nodeDef })!\n const ancestorMultipleEntity = getAncestor({ node, ancestorDefUuid: ancestorMultipleEntityDef.uuid })(record)!\n\n // 2. update enumerated entities\n for (const entityDef of dependentEnumeratedEntityDefs) {\n // sequential: each iteration updates the record\n await createOrDeleteEnumeratedEntities({ ...params, entityDef, parentNode: ancestorMultipleEntity, updateResult }) // NOSONAR\n }\n return updateResult\n}\n"]}
1
+ {"version":3,"file":"recordNodeDependentsEnumeratedEntitiesUpdater.js","sourceRoot":"","sources":["../../../../src/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArenaRecordNode, Nodes, NodeValues } from '../../node'\nimport { NodeDefCode, NodeDefEntity, NodeDefType } from '../../nodeDef'\nimport { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider'\nimport { Survey, Surveys } from '../../survey'\nimport { Objects } from '../../utils'\nimport { getAncestor, getChild, getChildren } from '../_records/recordGetters'\nimport { getEnumeratingCategoryItems } from '../_records/recordUtils'\nimport { getEnumeratingItemsAllowedCodes } from './recordEnumeratingItemsExpressionEvaluator'\nimport { RecordExpressionEvaluationContext } from './recordExpressionEvaluationContext'\nimport { RecordNodeDependentsUpdateParams } from './recordNodeDependentsUpdateParams'\nimport { createEnumeratedEntityNodes } from './recordNodesCreator'\nimport { deleteNodes } from './recordNodesDeleter'\nimport { RecordUpdateResult } from './recordUpdateResult'\n\nconst uuidsCompare = (uuidA: string, uuidB: string): number => uuidA.localeCompare(uuidB)\n\nconst shouldExistingEntitiesBeDeleted = async (params: {\n survey: Survey\n entityDef: NodeDefEntity\n existingEntities: ArenaRecordNode[]\n parentNode: ArenaRecordNode\n updateResult: RecordUpdateResult\n categoryItemProvider?: CategoryItemProvider\n user: RecordExpressionEvaluationContext['user']\n}) => {\n const { survey, entityDef, existingEntities, parentNode, updateResult, categoryItemProvider, user } = params\n const enumeratorDef = Surveys.getNodeDefEnumerator({ survey, entityDef })!\n const existingEnumeratingItemUuids = existingEntities\n .map((existingEntity) => {\n const existingEnumerator = getChild({ parentNode: existingEntity, childDefUuid: enumeratorDef.uuid })(\n updateResult.record\n )\n // an entity without enumerator item makes the lists differ, so the entities are recreated\n return (existingEnumerator ? NodeValues.getItemUuid(existingEnumerator) : undefined) ?? ''\n })\n .sort(uuidsCompare)\n\n const allowedCodes = await getEnumeratingItemsAllowedCodes({\n survey,\n user,\n record: updateResult.record,\n entityDef,\n parentNode,\n })\n\n const enumeratingCategoryItems = await getEnumeratingCategoryItems({\n survey,\n enumeratorDef,\n parentNode,\n categoryItemProvider,\n allowedCodes,\n })(updateResult.record)\n const newEnumeratingItemUuids = enumeratingCategoryItems.map((item) => item.uuid).sort(uuidsCompare)\n\n return !Objects.isEqual(newEnumeratingItemUuids, existingEnumeratingItemUuids)\n}\n\nexport const createOrDeleteEnumeratedEntities = async (\n params: RecordExpressionEvaluationContext & {\n parentNode: ArenaRecordNode\n entityDef: NodeDefEntity\n updateResult: RecordUpdateResult\n }\n) => {\n const { survey, parentNode, entityDef, categoryItemProvider, updateResult, sideEffect } = params\n const recordUpdateOptions = { sideEffect }\n const existingEntities = getChildren({ parentNode, childDefUuid: entityDef.uuid })(updateResult.record)\n const existingEntitiesCount = existingEntities.length\n const hasExistingEntities = existingEntitiesCount > 0\n const applicable = Nodes.isChildApplicable(parentNode, entityDef.uuid)\n\n const deleteExistingEntities = () => {\n const existingEntityUuids = existingEntities.map((node) => node.uuid)\n const nodesDeleteUpdatedResult = deleteNodes(existingEntityUuids, recordUpdateOptions)(updateResult.record)\n updateResult.merge(nodesDeleteUpdatedResult)\n }\n\n if (applicable) {\n if (hasExistingEntities) {\n const existingEntitiesToBeDeleted = await shouldExistingEntitiesBeDeleted({\n survey,\n entityDef,\n existingEntities,\n parentNode,\n updateResult,\n categoryItemProvider,\n user: params.user,\n })\n if (!existingEntitiesToBeDeleted) {\n // existing entities already match the enumerating items: nothing to do (do not create them again)\n return\n }\n deleteExistingEntities()\n }\n await createEnumeratedEntityNodes({ ...params, nodeDef: entityDef, parentNode })\n } else if (hasExistingEntities) {\n deleteExistingEntities()\n }\n}\n\nexport const updateDependentEnumeratedEntities = async (\n params: RecordNodeDependentsUpdateParams\n): Promise<RecordUpdateResult> => {\n const { survey, record, node } = params\n\n const updateResult = new RecordUpdateResult({ record })\n\n // 1. get dependent enumerated entities\n const { nodeDefUuid } = node\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: nodeDefUuid })\n if (nodeDef.type !== NodeDefType.code) return updateResult\n const codeDef = nodeDef as NodeDefCode\n\n const dependentEnumeratedEntityDefs = Surveys.getDependentEnumeratedEntityDefs({ survey, nodeDef: codeDef })\n if (dependentEnumeratedEntityDefs.length === 0) return updateResult\n\n const ancestorMultipleEntityDef = Surveys.getNodeDefAncestorMultipleEntity({ survey, nodeDef })!\n const ancestorMultipleEntity = getAncestor({ node, ancestorDefUuid: ancestorMultipleEntityDef.uuid })(record)!\n\n // 2. update enumerated entities\n for (const entityDef of dependentEnumeratedEntityDefs) {\n // sequential: each iteration updates the record\n await createOrDeleteEnumeratedEntities({ ...params, entityDef, parentNode: ancestorMultipleEntity, updateResult }) // NOSONAR\n }\n return updateResult\n}\n"]}
@@ -88,7 +88,7 @@ export const syncEnumeratingItemsEntities = (params) => __awaiter(void 0, void 0
88
88
  const existingItemUuids = new Set();
89
89
  for (const existingEntity of existingEntities) {
90
90
  const existingEnumerator = getChild({ parentNode: existingEntity, childDefUuid: enumeratorDef.uuid })(updateResult.record);
91
- const itemUuid = NodeValues.getItemUuid(existingEnumerator);
91
+ const itemUuid = existingEnumerator ? NodeValues.getItemUuid(existingEnumerator) : undefined;
92
92
  if (!itemUuid || !targetItemUuids.has(itemUuid)) {
93
93
  const nodesDeleteUpdatedResult = deleteNodes([existingEntity.uuid], recordUpdateOptions)(updateResult.record);
94
94
  updateResult.merge(nodesDeleteUpdatedResult);
@@ -1 +1 @@
1
- {"version":3,"file":"recordNodeDependentsEnumeratingItemsUpdater.js","sourceRoot":"","sources":["../../../../src/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAgC,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5E,OAAO,EAAiB,QAAQ,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,EAAU,OAAO,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAE1E,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,EAAE,+BAA+B,EAAE,MAAM,6CAA6C,CAAA;AAE7F,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,MAAM,+BAA+B,GAAG,CAAC,MAIxC,EAAiB,EAAE;IAClB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;IACvC,MAAM,YAAY,GAAG,OAAO,CAAC,wBAAwB,CAAC;QACpD,MAAM;QACN,IAAI;QACJ,cAAc,EAAE,oBAAoB,CAAC,gBAAgB;KACtD,CAAC,CAAC,MAAM,CAAC,CAAA;IAEV,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7C,OAAO,YAAY,CAAA;IACrB,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC;QACjD,MAAM;QACN,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,cAAc,EAAE,oBAAoB,CAAC,gBAAgB;KACtD,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,YAAY,CAAA;IACrB,CAAC;IAED,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,6BAA6B,CAAC,YAA6B,CAAC,EAAE,CAAC;YAC/G,SAAQ;QACV,CAAC;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAA;QAC7E,IAAI,CAAC,SAAS;YAAE,SAAQ;QAExB,MAAM,YAAY,GAAG,OAAO,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;QACvG,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAA;AACrB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,MAIC,EACc,EAAE;IACjB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,oBAAoB,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,CAAA;IACtG,MAAM,mBAAmB,GAAG,EAAE,UAAU,EAAE,CAAA;IAC1C,MAAM,gBAAgB,GAAG,WAAW,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;IACvG,MAAM,UAAU,GAAG,KAAK,CAAC,iBAAiB,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;IAEtE,MAAM,sBAAsB,GAAG,GAAG,EAAE;QAClC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrE,MAAM,wBAAwB,GAAG,WAAW,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QAC3G,YAAY,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;IAC9C,CAAC,CAAA;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,sBAAsB,EAAE,CAAA;QAC1B,CAAC;QACD,OAAM;IACR,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;IACzE,IAAI,CAAC,aAAa;QAAE,OAAM;IAE1B,MAAM,YAAY,GAAG,MAAM,+BAA+B,CAAC;QACzD,MAAM;QACN,IAAI;QACJ,MAAM,EAAE,YAAY,CAAC,MAAM;QAC3B,SAAS;QACT,UAAU;KACX,CAAC,CAAA;IAEF,MAAM,aAAa,GAAG,MAAM,2BAA2B,CAAC;QACtD,MAAM;QACN,aAAa;QACb,UAAU;QACV,oBAAoB;QACpB,YAAY;KACb,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;IAEvB,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IACvE,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAA;IAE3C,KAAK,MAAM,cAAc,IAAI,gBAAgB,EAAE,CAAC;QAC9C,MAAM,kBAAkB,GAAG,QAAQ,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC,CACnG,YAAY,CAAC,MAAM,CACpB,CAAA;QACD,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAA;QAC3D,IAAI,CAAC,QAAQ,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChD,MAAM,wBAAwB,GAAG,WAAW,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,mBAAmB,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;YAC7G,YAAY,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;QAC9C,CAAC;aAAM,CAAC;YACN,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,MAAM,YAAY,GAAG;gBACnB,IAAI;gBACJ,MAAM;gBACN,UAAU;gBACV,OAAO,EAAE,SAAS;gBAClB,aAAa;gBACb,YAAY;gBACZ,YAAY;gBACZ,UAAU;aACX,CAAA;YACD,mEAAmE;YACnE,MAAM,0BAA0B,CAAC,YAAY,CAAC,CAAA,CAAC,UAAU;QAC3D,CAAC;IACH,CAAC;AACH,CAAC,CAAA,CAAA;AAED,MAAM,CAAC,MAAM,uCAAuC,GAAG,CACrD,MAAwC,EACX,EAAE;IAC/B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;IAEvC,MAAM,YAAY,GAAG,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IAEvD,MAAM,YAAY,GAAG,+BAA+B,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IAE9E,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,WAAW,CAAA;QACpD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAQ;QAEzC,MAAM,SAAS,GAAG,OAAwB,CAAA;QAC1C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC;YAAE,SAAQ;QAC9C,IAAI,CAAC,QAAQ,CAAC,6BAA6B,CAAC,SAAS,CAAC;YAAE,SAAQ;QAEhE,gDAAgD;QAChD,MAAM,4BAA4B,iCAAM,MAAM,KAAE,UAAU,EAAE,SAAS,EAAE,YAAY,IAAG,CAAA,CAAC,UAAU;IACnG,CAAC;IAED,OAAO,YAAY,CAAA;AACrB,CAAC,CAAA,CAAA","sourcesContent":["import { ArenaRecordNode, NodePointer, Nodes, NodeValues } from '../../node'\nimport { NodeDefEntity, NodeDefs } from '../../nodeDef'\nimport { Survey, Surveys } from '../../survey'\nimport { SurveyDependencyType } from '../../survey/survey'\nimport { getChild, getChildren, getRoot } from '../_records/recordGetters'\nimport { ArenaRecord } from '../record'\nimport { Records } from '../records'\nimport { getEnumeratingCategoryItems } from '../_records/recordUtils'\nimport { getEnumeratingItemsAllowedCodes } from './recordEnumeratingItemsExpressionEvaluator'\nimport { RecordNodeDependentsUpdateParams } from './recordNodeDependentsUpdateParams'\nimport { createEnumeratedEntityNode } from './recordNodesCreator'\nimport { deleteNodes } from './recordNodesDeleter'\nimport { RecordUpdateResult } from './recordUpdateResult'\n\nconst getEnumeratingItemsNodePointers = (params: {\n survey: Survey\n record: ArenaRecord\n node: ArenaRecordNode\n}): NodePointer[] => {\n const { survey, record, node } = params\n const nodePointers = Records.getDependentNodePointers({\n survey,\n node,\n dependencyType: SurveyDependencyType.enumeratingItems,\n })(record)\n\n if (nodePointers.length > 0 || !node.deleted) {\n return nodePointers\n }\n\n const dependentDefs = Surveys.getNodeDefDependents({\n survey,\n nodeDefUuid: node.nodeDefUuid,\n dependencyType: SurveyDependencyType.enumeratingItems,\n })\n const root = getRoot(record)\n if (!root) {\n return nodePointers\n }\n\n for (const dependentDef of dependentDefs) {\n if (!NodeDefs.isEntity(dependentDef) || !NodeDefs.getEnumeratingItemsExpression(dependentDef as NodeDefEntity)) {\n continue\n }\n const parentDef = Surveys.getNodeDefParent({ survey, nodeDef: dependentDef })\n if (!parentDef) continue\n\n const contextNodes = Records.getDescendantsOrSelf({ node: root, nodeDefDescendant: parentDef })(record)\n for (const contextNode of contextNodes) {\n nodePointers.push({ nodeCtx: contextNode, nodeDef: dependentDef })\n }\n }\n\n return nodePointers\n}\n\nexport const syncEnumeratingItemsEntities = async (\n params: RecordNodeDependentsUpdateParams & {\n parentNode: ArenaRecordNode\n entityDef: NodeDefEntity\n updateResult: RecordUpdateResult\n }\n): Promise<void> => {\n const { survey, user, parentNode, entityDef, categoryItemProvider, updateResult, sideEffect } = params\n const recordUpdateOptions = { sideEffect }\n const existingEntities = getChildren({ parentNode, childDefUuid: entityDef.uuid })(updateResult.record)\n const applicable = Nodes.isChildApplicable(parentNode, entityDef.uuid)\n\n const deleteExistingEntities = () => {\n const existingEntityUuids = existingEntities.map((node) => node.uuid)\n const nodesDeleteUpdatedResult = deleteNodes(existingEntityUuids, recordUpdateOptions)(updateResult.record)\n updateResult.merge(nodesDeleteUpdatedResult)\n }\n\n if (!applicable) {\n if (existingEntities.length > 0) {\n deleteExistingEntities()\n }\n return\n }\n\n const enumeratorDef = Surveys.getNodeDefEnumerator({ survey, entityDef })\n if (!enumeratorDef) return\n\n const allowedCodes = await getEnumeratingItemsAllowedCodes({\n survey,\n user,\n record: updateResult.record,\n entityDef,\n parentNode,\n })\n\n const categoryItems = await getEnumeratingCategoryItems({\n survey,\n enumeratorDef,\n parentNode,\n categoryItemProvider,\n allowedCodes,\n })(updateResult.record)\n\n const targetItemUuids = new Set(categoryItems.map((item) => item.uuid))\n const existingItemUuids = new Set<string>()\n\n for (const existingEntity of existingEntities) {\n const existingEnumerator = getChild({ parentNode: existingEntity, childDefUuid: enumeratorDef.uuid })(\n updateResult.record\n )\n const itemUuid = NodeValues.getItemUuid(existingEnumerator)\n if (!itemUuid || !targetItemUuids.has(itemUuid)) {\n const nodesDeleteUpdatedResult = deleteNodes([existingEntity.uuid], recordUpdateOptions)(updateResult.record)\n updateResult.merge(nodesDeleteUpdatedResult)\n } else {\n existingItemUuids.add(itemUuid)\n }\n }\n\n for (const categoryItem of categoryItems) {\n if (!existingItemUuids.has(categoryItem.uuid)) {\n const createParams = {\n user,\n survey,\n parentNode,\n nodeDef: entityDef,\n enumeratorDef,\n categoryItem,\n updateResult,\n sideEffect,\n }\n // create entities sequentially: every iteration updates the record\n await createEnumeratedEntityNode(createParams) // NOSONAR\n }\n }\n}\n\nexport const updateDependentEnumeratingItemsEntities = async (\n params: RecordNodeDependentsUpdateParams\n): Promise<RecordUpdateResult> => {\n const { survey, record, node } = params\n\n const updateResult = new RecordUpdateResult({ record })\n\n const nodePointers = getEnumeratingItemsNodePointers({ survey, record, node })\n\n for (const nodePointer of nodePointers) {\n const { nodeCtx: parentNode, nodeDef } = nodePointer\n if (!NodeDefs.isEntity(nodeDef)) continue\n\n const entityDef = nodeDef as NodeDefEntity\n if (!NodeDefs.isEnumerate(entityDef)) continue\n if (!NodeDefs.getEnumeratingItemsExpression(entityDef)) continue\n\n // sequential: each iteration updates the record\n await syncEnumeratingItemsEntities({ ...params, parentNode, entityDef, updateResult }) // NOSONAR\n }\n\n return updateResult\n}\n"]}
1
+ {"version":3,"file":"recordNodeDependentsEnumeratingItemsUpdater.js","sourceRoot":"","sources":["../../../../src/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAgC,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5E,OAAO,EAAiB,QAAQ,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,EAAU,OAAO,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAE1E,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,EAAE,+BAA+B,EAAE,MAAM,6CAA6C,CAAA;AAE7F,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,MAAM,+BAA+B,GAAG,CAAC,MAIxC,EAAiB,EAAE;IAClB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;IACvC,MAAM,YAAY,GAAG,OAAO,CAAC,wBAAwB,CAAC;QACpD,MAAM;QACN,IAAI;QACJ,cAAc,EAAE,oBAAoB,CAAC,gBAAgB;KACtD,CAAC,CAAC,MAAM,CAAC,CAAA;IAEV,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7C,OAAO,YAAY,CAAA;IACrB,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC;QACjD,MAAM;QACN,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,cAAc,EAAE,oBAAoB,CAAC,gBAAgB;KACtD,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,YAAY,CAAA;IACrB,CAAC;IAED,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,6BAA6B,CAAC,YAA6B,CAAC,EAAE,CAAC;YAC/G,SAAQ;QACV,CAAC;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAA;QAC7E,IAAI,CAAC,SAAS;YAAE,SAAQ;QAExB,MAAM,YAAY,GAAG,OAAO,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;QACvG,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAA;AACrB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,MAIC,EACc,EAAE;IACjB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,oBAAoB,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,CAAA;IACtG,MAAM,mBAAmB,GAAG,EAAE,UAAU,EAAE,CAAA;IAC1C,MAAM,gBAAgB,GAAG,WAAW,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;IACvG,MAAM,UAAU,GAAG,KAAK,CAAC,iBAAiB,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;IAEtE,MAAM,sBAAsB,GAAG,GAAG,EAAE;QAClC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrE,MAAM,wBAAwB,GAAG,WAAW,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QAC3G,YAAY,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;IAC9C,CAAC,CAAA;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,sBAAsB,EAAE,CAAA;QAC1B,CAAC;QACD,OAAM;IACR,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;IACzE,IAAI,CAAC,aAAa;QAAE,OAAM;IAE1B,MAAM,YAAY,GAAG,MAAM,+BAA+B,CAAC;QACzD,MAAM;QACN,IAAI;QACJ,MAAM,EAAE,YAAY,CAAC,MAAM;QAC3B,SAAS;QACT,UAAU;KACX,CAAC,CAAA;IAEF,MAAM,aAAa,GAAG,MAAM,2BAA2B,CAAC;QACtD,MAAM;QACN,aAAa;QACb,UAAU;QACV,oBAAoB;QACpB,YAAY;KACb,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;IAEvB,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IACvE,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAA;IAE3C,KAAK,MAAM,cAAc,IAAI,gBAAgB,EAAE,CAAC;QAC9C,MAAM,kBAAkB,GAAG,QAAQ,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC,CACnG,YAAY,CAAC,MAAM,CACpB,CAAA;QACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC5F,IAAI,CAAC,QAAQ,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChD,MAAM,wBAAwB,GAAG,WAAW,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,mBAAmB,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;YAC7G,YAAY,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;QAC9C,CAAC;aAAM,CAAC;YACN,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,MAAM,YAAY,GAAG;gBACnB,IAAI;gBACJ,MAAM;gBACN,UAAU;gBACV,OAAO,EAAE,SAAS;gBAClB,aAAa;gBACb,YAAY;gBACZ,YAAY;gBACZ,UAAU;aACX,CAAA;YACD,mEAAmE;YACnE,MAAM,0BAA0B,CAAC,YAAY,CAAC,CAAA,CAAC,UAAU;QAC3D,CAAC;IACH,CAAC;AACH,CAAC,CAAA,CAAA;AAED,MAAM,CAAC,MAAM,uCAAuC,GAAG,CACrD,MAAwC,EACX,EAAE;IAC/B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;IAEvC,MAAM,YAAY,GAAG,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IAEvD,MAAM,YAAY,GAAG,+BAA+B,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IAE9E,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,WAAW,CAAA;QACpD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAQ;QAEzC,MAAM,SAAS,GAAG,OAAwB,CAAA;QAC1C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC;YAAE,SAAQ;QAC9C,IAAI,CAAC,QAAQ,CAAC,6BAA6B,CAAC,SAAS,CAAC;YAAE,SAAQ;QAEhE,gDAAgD;QAChD,MAAM,4BAA4B,iCAAM,MAAM,KAAE,UAAU,EAAE,SAAS,EAAE,YAAY,IAAG,CAAA,CAAC,UAAU;IACnG,CAAC;IAED,OAAO,YAAY,CAAA;AACrB,CAAC,CAAA,CAAA","sourcesContent":["import { ArenaRecordNode, NodePointer, Nodes, NodeValues } from '../../node'\nimport { NodeDefEntity, NodeDefs } from '../../nodeDef'\nimport { Survey, Surveys } from '../../survey'\nimport { SurveyDependencyType } from '../../survey/survey'\nimport { getChild, getChildren, getRoot } from '../_records/recordGetters'\nimport { ArenaRecord } from '../record'\nimport { Records } from '../records'\nimport { getEnumeratingCategoryItems } from '../_records/recordUtils'\nimport { getEnumeratingItemsAllowedCodes } from './recordEnumeratingItemsExpressionEvaluator'\nimport { RecordNodeDependentsUpdateParams } from './recordNodeDependentsUpdateParams'\nimport { createEnumeratedEntityNode } from './recordNodesCreator'\nimport { deleteNodes } from './recordNodesDeleter'\nimport { RecordUpdateResult } from './recordUpdateResult'\n\nconst getEnumeratingItemsNodePointers = (params: {\n survey: Survey\n record: ArenaRecord\n node: ArenaRecordNode\n}): NodePointer[] => {\n const { survey, record, node } = params\n const nodePointers = Records.getDependentNodePointers({\n survey,\n node,\n dependencyType: SurveyDependencyType.enumeratingItems,\n })(record)\n\n if (nodePointers.length > 0 || !node.deleted) {\n return nodePointers\n }\n\n const dependentDefs = Surveys.getNodeDefDependents({\n survey,\n nodeDefUuid: node.nodeDefUuid,\n dependencyType: SurveyDependencyType.enumeratingItems,\n })\n const root = getRoot(record)\n if (!root) {\n return nodePointers\n }\n\n for (const dependentDef of dependentDefs) {\n if (!NodeDefs.isEntity(dependentDef) || !NodeDefs.getEnumeratingItemsExpression(dependentDef as NodeDefEntity)) {\n continue\n }\n const parentDef = Surveys.getNodeDefParent({ survey, nodeDef: dependentDef })\n if (!parentDef) continue\n\n const contextNodes = Records.getDescendantsOrSelf({ node: root, nodeDefDescendant: parentDef })(record)\n for (const contextNode of contextNodes) {\n nodePointers.push({ nodeCtx: contextNode, nodeDef: dependentDef })\n }\n }\n\n return nodePointers\n}\n\nexport const syncEnumeratingItemsEntities = async (\n params: RecordNodeDependentsUpdateParams & {\n parentNode: ArenaRecordNode\n entityDef: NodeDefEntity\n updateResult: RecordUpdateResult\n }\n): Promise<void> => {\n const { survey, user, parentNode, entityDef, categoryItemProvider, updateResult, sideEffect } = params\n const recordUpdateOptions = { sideEffect }\n const existingEntities = getChildren({ parentNode, childDefUuid: entityDef.uuid })(updateResult.record)\n const applicable = Nodes.isChildApplicable(parentNode, entityDef.uuid)\n\n const deleteExistingEntities = () => {\n const existingEntityUuids = existingEntities.map((node) => node.uuid)\n const nodesDeleteUpdatedResult = deleteNodes(existingEntityUuids, recordUpdateOptions)(updateResult.record)\n updateResult.merge(nodesDeleteUpdatedResult)\n }\n\n if (!applicable) {\n if (existingEntities.length > 0) {\n deleteExistingEntities()\n }\n return\n }\n\n const enumeratorDef = Surveys.getNodeDefEnumerator({ survey, entityDef })\n if (!enumeratorDef) return\n\n const allowedCodes = await getEnumeratingItemsAllowedCodes({\n survey,\n user,\n record: updateResult.record,\n entityDef,\n parentNode,\n })\n\n const categoryItems = await getEnumeratingCategoryItems({\n survey,\n enumeratorDef,\n parentNode,\n categoryItemProvider,\n allowedCodes,\n })(updateResult.record)\n\n const targetItemUuids = new Set(categoryItems.map((item) => item.uuid))\n const existingItemUuids = new Set<string>()\n\n for (const existingEntity of existingEntities) {\n const existingEnumerator = getChild({ parentNode: existingEntity, childDefUuid: enumeratorDef.uuid })(\n updateResult.record\n )\n const itemUuid = existingEnumerator ? NodeValues.getItemUuid(existingEnumerator) : undefined\n if (!itemUuid || !targetItemUuids.has(itemUuid)) {\n const nodesDeleteUpdatedResult = deleteNodes([existingEntity.uuid], recordUpdateOptions)(updateResult.record)\n updateResult.merge(nodesDeleteUpdatedResult)\n } else {\n existingItemUuids.add(itemUuid)\n }\n }\n\n for (const categoryItem of categoryItems) {\n if (!existingItemUuids.has(categoryItem.uuid)) {\n const createParams = {\n user,\n survey,\n parentNode,\n nodeDef: entityDef,\n enumeratorDef,\n categoryItem,\n updateResult,\n sideEffect,\n }\n // create entities sequentially: every iteration updates the record\n await createEnumeratedEntityNode(createParams) // NOSONAR\n }\n }\n}\n\nexport const updateDependentEnumeratingItemsEntities = async (\n params: RecordNodeDependentsUpdateParams\n): Promise<RecordUpdateResult> => {\n const { survey, record, node } = params\n\n const updateResult = new RecordUpdateResult({ record })\n\n const nodePointers = getEnumeratingItemsNodePointers({ survey, record, node })\n\n for (const nodePointer of nodePointers) {\n const { nodeCtx: parentNode, nodeDef } = nodePointer\n if (!NodeDefs.isEntity(nodeDef)) continue\n\n const entityDef = nodeDef as NodeDefEntity\n if (!NodeDefs.isEnumerate(entityDef)) continue\n if (!NodeDefs.getEnumeratingItemsExpression(entityDef)) continue\n\n // sequential: each iteration updates the record\n await syncEnumeratingItemsEntities({ ...params, parentNode, entityDef, updateResult }) // NOSONAR\n }\n\n return updateResult\n}\n"]}
@@ -27,21 +27,32 @@ export type PositionalRecordGetter<P, A extends unknown[], R> = {
27
27
  export declare const getCycle: (record: ArenaRecord) => string;
28
28
  export declare const getNodes: (record: ArenaRecord) => Dictionary<ArenaRecordNode>;
29
29
  export declare const getNodesArray: (record: ArenaRecord) => ArenaRecordNode[];
30
+ /**
31
+ * Returns the node with the specified uuid, or undefined if not found.
32
+ * Like the other node getters, it does not throw an error when the node is not found.
33
+ */
30
34
  export declare const getNodeByUuid: PositionalRecordGetter<{
31
35
  uuid: string;
32
36
  }, [uuid: string], ArenaRecordNode | undefined>;
33
37
  export declare const getNodesByUuids: PositionalRecordGetter<{
34
38
  uuids: string[];
35
39
  }, [uuids: string[]], ArenaRecordNode[]>;
40
+ /**
41
+ * Returns the root node, or undefined if the record has no nodes.
42
+ */
36
43
  export declare const getRoot: (record: ArenaRecord) => ArenaRecordNode | undefined;
37
44
  export declare const getChildren: PositionalRecordGetter<{
38
45
  parentNode: ArenaRecordNode;
39
46
  childDefUuid?: string;
40
47
  }, [parentNode: ArenaRecordNode, childDefUuid?: string | undefined], ArenaRecordNode[]>;
48
+ /**
49
+ * Returns the only child of the parent node with the specified node def, or undefined if not found.
50
+ * Throws an error if more than one child is found.
51
+ */
41
52
  export declare const getChild: PositionalRecordGetter<{
42
53
  parentNode: ArenaRecordNode;
43
54
  childDefUuid: string;
44
- }, [parentNode: ArenaRecordNode, childDefUuid: string], ArenaRecordNode>;
55
+ }, [parentNode: ArenaRecordNode, childDefUuid: string], ArenaRecordNode | undefined>;
45
56
  export declare const getParent: PositionalRecordGetter<{
46
57
  node: ArenaRecordNode;
47
58
  }, [node: ArenaRecordNode], ArenaRecordNode | undefined>;
@@ -78,6 +89,9 @@ export declare const findAncestor: (params: {
78
89
  node: ArenaRecordNode;
79
90
  predicate: (node: ArenaRecordNode) => boolean;
80
91
  }) => (record: ArenaRecord) => ArenaRecordNode | undefined;
92
+ /**
93
+ * Returns the specified node, if it has the specified node def, or its ancestor with that node def; undefined if not found.
94
+ */
81
95
  export declare const getAncestor: RecordGetter<{
82
96
  record: ArenaRecord;
83
97
  node: ArenaRecordNode;
@@ -95,11 +109,14 @@ export declare const getDescendantsOrSelf: RecordGetter<{
95
109
  node: ArenaRecordNode;
96
110
  nodeDefDescendant: NodeDef<any>;
97
111
  }, ArenaRecordNode[]>;
112
+ /**
113
+ * Returns the first descendant (or the node itself) with the specified node def, or undefined if not found.
114
+ */
98
115
  export declare const getDescendant: RecordGetter<{
99
116
  record: ArenaRecord;
100
117
  node: ArenaRecordNode;
101
118
  nodeDefDescendant: NodeDef<any>;
102
- }, ArenaRecordNode>;
119
+ }, ArenaRecordNode | undefined>;
103
120
  export declare const isDescendantOf: (params: {
104
121
  node: ArenaRecordNode;
105
122
  ancestor: ArenaRecordNode;
@@ -42,6 +42,10 @@ const getNodes = (record) => { var _a; return (_a = record.nodes) !== null && _a
42
42
  exports.getNodes = getNodes;
43
43
  const getNodesArray = (record) => Object.values((0, exports.getNodes)(record));
44
44
  exports.getNodesArray = getNodesArray;
45
+ /**
46
+ * Returns the node with the specified uuid, or undefined if not found.
47
+ * Like the other node getters, it does not throw an error when the node is not found.
48
+ */
45
49
  exports.getNodeByUuid = positionalRecordGetter({
46
50
  getter: ({ record, uuid }) => { var _a; return (_a = record.nodes) === null || _a === void 0 ? void 0 : _a[uuid]; },
47
51
  isPositional: isString,
@@ -52,6 +56,9 @@ exports.getNodesByUuids = positionalRecordGetter({
52
56
  isPositional: Array.isArray,
53
57
  toParams: (uuids) => ({ uuids }),
54
58
  });
59
+ /**
60
+ * Returns the root node, or undefined if the record has no nodes.
61
+ */
55
62
  const getRoot = (record) => {
56
63
  const rootUuid = record._nodesIndex ? recordNodesIndexReader_1.RecordNodesIndexReader.getNodeRootUuid(record._nodesIndex) : null;
57
64
  if (rootUuid) {
@@ -76,17 +83,18 @@ exports.getChildren = positionalRecordGetter({
76
83
  isPositional: isRecordNode,
77
84
  toParams: (parentNode, childDefUuid) => ({ parentNode, childDefUuid }),
78
85
  });
86
+ /**
87
+ * Returns the only child of the parent node with the specified node def, or undefined if not found.
88
+ * Throws an error if more than one child is found.
89
+ */
79
90
  exports.getChild = positionalRecordGetter({
80
91
  getter: ({ record, parentNode, childDefUuid, }) => {
81
92
  const children = (0, exports.getChildren)({ parentNode, childDefUuid })(record);
82
- const errorParams = { childDefUuid, parentNodeUuid: parentNode.uuid, recordUuid: record.uuid };
83
- if (children.length === 1) {
84
- return children[0];
85
- }
86
93
  if (children.length > 1) {
94
+ const errorParams = { childDefUuid, parentNodeUuid: parentNode.uuid, recordUuid: record.uuid };
87
95
  throw new error_1.SystemError('systemError.record.multipleNodesFound', errorParams);
88
96
  }
89
- throw new error_1.SystemError('systemError.record.childNotFound', errorParams);
97
+ return children[0];
90
98
  },
91
99
  isPositional: isRecordNode,
92
100
  toParams: (parentNode, childDefUuid) => ({ parentNode, childDefUuid }),
@@ -189,6 +197,9 @@ const findAncestor = (params) => (record) => {
189
197
  return result;
190
198
  };
191
199
  exports.findAncestor = findAncestor;
200
+ /**
201
+ * Returns the specified node, if it has the specified node def, or its ancestor with that node def; undefined if not found.
202
+ */
192
203
  exports.getAncestor = recordGetter((params) => {
193
204
  const { record, node, ancestorDefUuid } = params;
194
205
  if (node.nodeDefUuid === ancestorDefUuid)
@@ -233,6 +244,9 @@ exports.getDescendantsOrSelf = recordGetter((params) => {
233
244
  }
234
245
  return currentAncestors; // currentAncestors is equal to the currentDescendants of the last level
235
246
  });
247
+ /**
248
+ * Returns the first descendant (or the node itself) with the specified node def, or undefined if not found.
249
+ */
236
250
  exports.getDescendant = recordGetter((params) => {
237
251
  const { record, node, nodeDefDescendant } = params;
238
252
  return (0, exports.getDescendantsOrSelf)({ node, nodeDefDescendant })(record)[0];
@@ -315,6 +329,7 @@ exports.getEntityKeyNodesByDefUuid = recordGetter((params) => {
315
329
  const nodeDefKeys = keyDefs !== null && keyDefs !== void 0 ? keyDefs : survey_1.Surveys.getNodeDefKeys({ survey, cycle, nodeDef });
316
330
  return nodeDefKeys.reduce((acc, nodeDefKey) => {
317
331
  const nodeKey = (0, exports.getDescendant)({ node: entity, nodeDefDescendant: nodeDefKey })(record);
332
+ // missing key nodes are kept as undefined entries
318
333
  acc[nodeDefKey.uuid] = nodeKey;
319
334
  return acc;
320
335
  }, {});
@@ -1 +1 @@
1
- {"version":3,"file":"recordGetters.js","sourceRoot":"","sources":["../../../src/record/_records/recordGetters.ts"],"names":[],"mappings":"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","sourcesContent":["import { Dictionary, TraverseMethod } from '../../common'\nimport { SystemError } from '../../error'\nimport { ArenaRecordNode, NodePointer, Nodes, NodesMap } from '../../node'\nimport { NodeValues } from '../../node/nodeValues'\nimport { NodeDef, NodeDefCode, NodeDefCodeProps, NodeDefProps, NodeDefs, NodeDefType } from '../../nodeDef'\nimport { defaultCycle, Surveys } from '../../survey'\nimport { Survey, SurveyDependencyType } from '../../survey/survey'\nimport { Arrays, Queue } from '../../utils'\nimport { ArenaRecord, RECORD_STEP_DEFAULT } from '../record'\nimport { RecordStepAnalysisCode } from '../recordStep'\nimport { RecordNodesIndexReader } from './recordNodesIndexReader'\nimport { NodeDefSelfReferences } from './nodeDefSelfReferences'\n\nexport type RecordParams = { record: ArenaRecord }\n\n/**\n * Record getter: takes the parameters first and the record as separate (curried) parameter: `getter(params)(record)`.\n * The deprecated form, with the record inside the parameters (`getter({ record, ...params })`), is still supported.\n */\nexport type RecordGetter<P extends RecordParams, R> = {\n /** @deprecated Pass the record as separate parameter: `getter(params)(record)` */\n (params: P): R\n (params: Omit<P, 'record'>): (record: ArenaRecord) => R\n}\n\nconst isRecordParams = (params: object): params is RecordParams => 'record' in params\n\nconst recordGetter = <P extends RecordParams, R>(getter: (params: P) => R): RecordGetter<P, R> =>\n ((params: P | Omit<P, 'record'>) =>\n isRecordParams(params)\n ? getter(params as P)\n : (record: ArenaRecord) => getter({ ...params, record } as P)) as RecordGetter<P, R>\n\n/**\n * Record getter (with parameters object) that also supports the deprecated form with positional parameters:\n * `getter(arg1, arg2)(record)`.\n */\nexport type PositionalRecordGetter<P, A extends unknown[], R> = {\n (params: P): (record: ArenaRecord) => R\n /** @deprecated Pass the parameters as an object: `getter({ ...params })(record)` */\n (...args: A): (record: ArenaRecord) => R\n}\n\nconst positionalRecordGetter = <P, A extends unknown[], R>(params: {\n getter: (params: P & RecordParams) => R\n isPositional: (firstArg: unknown) => boolean\n toParams: (...args: A) => NoInfer<P>\n}): PositionalRecordGetter<P, A, R> => {\n const { getter, isPositional, toParams } = params\n return ((...args: unknown[]) => {\n const getterParams = isPositional(args[0]) ? toParams(...(args as A)) : (args[0] as P)\n return (record: ArenaRecord) => getter({ ...getterParams, record })\n }) as PositionalRecordGetter<P, A, R>\n}\n\nconst isRecordNode = (arg: unknown): arg is ArenaRecordNode =>\n typeof arg === 'object' && arg !== null && 'uuid' in arg && 'nodeDefUuid' in arg\nconst isString = (arg: unknown): arg is string => typeof arg === 'string'\n\nexport const getCycle = (record: ArenaRecord): string => record.cycle ?? defaultCycle\n\nexport const getNodes = (record: ArenaRecord): Dictionary<ArenaRecordNode> => record.nodes ?? {}\n\nexport const getNodesArray = (record: ArenaRecord): ArenaRecordNode[] => Object.values(getNodes(record))\n\nexport const getNodeByUuid = positionalRecordGetter({\n getter: ({ record, uuid }: RecordParams & { uuid: string }): ArenaRecordNode | undefined => record.nodes?.[uuid],\n isPositional: isString,\n toParams: (uuid: string) => ({ uuid }),\n})\n\nexport const getNodesByUuids = positionalRecordGetter({\n getter: ({ record, uuids }: RecordParams & { uuids: string[] }): ArenaRecordNode[] =>\n uuids.map((uuid: string) => record.nodes?.[uuid]) as ArenaRecordNode[],\n isPositional: Array.isArray,\n toParams: (uuids: string[]) => ({ uuids }),\n})\n\nexport const getRoot = (record: ArenaRecord): ArenaRecordNode | undefined => {\n const rootUuid = record._nodesIndex ? RecordNodesIndexReader.getNodeRootUuid(record._nodesIndex) : null\n if (rootUuid) {\n return getNodeByUuid({ uuid: rootUuid })(record)\n }\n return getNodesArray(record).find((node) => !node.parentUuid)\n}\n\nexport const getChildren = positionalRecordGetter({\n getter: ({\n record,\n parentNode,\n childDefUuid,\n }: RecordParams & { parentNode: ArenaRecordNode; childDefUuid?: string }): ArenaRecordNode[] => {\n if (record._nodesIndex) {\n const childrenUuids = childDefUuid\n ? RecordNodesIndexReader.getNodeUuidsByParentAndChildDef({\n parentNodeUuid: parentNode.uuid,\n childDefUuid,\n })(record._nodesIndex)\n : RecordNodesIndexReader.getNodeUuidsByParent(parentNode.uuid)(record._nodesIndex)\n return getNodesByUuids({ uuids: childrenUuids })(record)\n }\n return getNodesArray(record).filter(\n (node) => node.parentUuid === parentNode.uuid && (!childDefUuid || node.nodeDefUuid == childDefUuid)\n )\n },\n isPositional: isRecordNode,\n toParams: (parentNode: ArenaRecordNode, childDefUuid?: string) => ({ parentNode, childDefUuid }),\n})\n\nexport const getChild = positionalRecordGetter({\n getter: ({\n record,\n parentNode,\n childDefUuid,\n }: RecordParams & { parentNode: ArenaRecordNode; childDefUuid: string }): ArenaRecordNode => {\n const children = getChildren({ parentNode, childDefUuid })(record)\n const errorParams = { childDefUuid, parentNodeUuid: parentNode.uuid, recordUuid: record.uuid }\n if (children.length === 1) {\n return children[0]\n }\n if (children.length > 1) {\n throw new SystemError('systemError.record.multipleNodesFound', errorParams)\n }\n throw new SystemError('systemError.record.childNotFound', errorParams)\n },\n isPositional: isRecordNode,\n toParams: (parentNode: ArenaRecordNode, childDefUuid: string) => ({ parentNode, childDefUuid }),\n})\n\nexport const getParent = positionalRecordGetter({\n getter: ({ record, node }: RecordParams & { node: ArenaRecordNode }): ArenaRecordNode | undefined =>\n node.parentUuid ? getNodeByUuid({ uuid: node.parentUuid })(record) : undefined,\n isPositional: isRecordNode,\n toParams: (node: ArenaRecordNode) => ({ node }),\n})\n\nexport const getNodesByDefUuid = positionalRecordGetter({\n getter: ({ record, nodeDefUuid }: RecordParams & { nodeDefUuid: string }): ArenaRecordNode[] => {\n if (record._nodesIndex) {\n const nodeUuids = RecordNodesIndexReader.getNodeUuidsByDef(nodeDefUuid)(record._nodesIndex)\n return getNodesByUuids({ uuids: nodeUuids })(record)\n }\n return getNodesArray(record).filter((node) => node.nodeDefUuid === nodeDefUuid)\n },\n isPositional: isString,\n toParams: (nodeDefUuid: string) => ({ nodeDefUuid }),\n})\n\nconst isNodeFlagTrue = (isChildFlagTrue: (parent: ArenaRecordNode, nodeDefUuid: string) => boolean) =>\n recordGetter((params: RecordParams & { node: ArenaRecordNode }): boolean => {\n const { record, node } = params\n const ancestorsAndSelf = getAncestorsAndSelf({ node })(record)\n for (let i = 0; i < ancestorsAndSelf.length - 1; i++) {\n const child = ancestorsAndSelf[i]\n const parent = ancestorsAndSelf[i + 1]\n if (!isChildFlagTrue(parent, child.nodeDefUuid)) return false\n }\n return true\n })\n\nexport const isNodeApplicable = isNodeFlagTrue((parent, nodeDefUuid) => Nodes.isChildApplicable(parent, nodeDefUuid))\nexport const isNodeEditable = isNodeFlagTrue((parent, nodeDefUuid) => Nodes.isChildEditable(parent, nodeDefUuid))\nexport const isNodeVisible = isNodeFlagTrue((parent, nodeDefUuid) => Nodes.isChildVisible(parent, nodeDefUuid))\n\nexport const getDependentCodeAttributes = positionalRecordGetter({\n getter: ({ record, node }: RecordParams & { node: ArenaRecordNode }): ArenaRecordNode[] => {\n if (record._nodesIndex) {\n const nodeUuids = RecordNodesIndexReader.getNodeCodeDependentUuids(node.uuid)(record._nodesIndex)\n return getNodesByUuids({ uuids: nodeUuids })(record)\n }\n throw new SystemError('record.nodesIndexNotInitialized')\n },\n isPositional: isRecordNode,\n toParams: (node: ArenaRecordNode) => ({ node }),\n})\n\nexport const getParentCodeAttribute =\n (params: { parentNode: ArenaRecordNode; nodeDef: NodeDefCode }) =>\n (record: ArenaRecord): ArenaRecordNode | undefined => {\n const { parentNode, nodeDef } = params\n\n const parentCodeDefUuid = NodeDefs.getParentCodeDefUuid(nodeDef)\n if (!parentCodeDefUuid) return undefined\n\n const ancestors = getAncestorsAndSelf({ node: parentNode })(record)\n for (const ancestor of ancestors) {\n const children = getChildren({ parentNode: ancestor, childDefUuid: parentCodeDefUuid })(record)\n if (children.length === 1) {\n return children[0]\n }\n }\n return undefined\n }\n\n// ancestors\n\n/**\n * Visits the specified node and its ancestors, from the node up to the root: the visit stops when the visitor returns true.\n */\nexport const visitAncestorsAndSelf = positionalRecordGetter({\n getter: ({\n record,\n node,\n visitor,\n }: RecordParams & { node: ArenaRecordNode; visitor: (node: ArenaRecordNode) => boolean | void }): void => {\n let currentNode: ArenaRecordNode | undefined = node\n while (currentNode) {\n if (visitor(currentNode)) return\n currentNode = getParent({ node: currentNode })(record)\n }\n },\n isPositional: isRecordNode,\n // deprecated form: the visit stops when stopIfFn returns true\n toParams: (node: ArenaRecordNode, visitor: (node: ArenaRecordNode) => void, stopIfFn?: () => boolean) => ({\n node,\n visitor: (visitedNode: ArenaRecordNode): boolean => {\n visitor(visitedNode)\n return !!stopIfFn?.()\n },\n }),\n})\n\n/**\n * Returns the first node satisfying the predicate among the specified node and its ancestors (from the node up to the root).\n */\nexport const findAncestor =\n (params: { node: ArenaRecordNode; predicate: (node: ArenaRecordNode) => boolean }) =>\n (record: ArenaRecord): ArenaRecordNode | undefined => {\n const { node, predicate } = params\n let result: ArenaRecordNode | undefined = undefined\n visitAncestorsAndSelf({\n node,\n visitor: (visitedNode) => {\n if (predicate(visitedNode)) {\n result = visitedNode\n return true\n }\n return false\n },\n })(record)\n return result\n }\n\nexport const getAncestor = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode; ancestorDefUuid: string }): ArenaRecordNode | undefined => {\n const { record, node, ancestorDefUuid } = params\n if (node.nodeDefUuid === ancestorDefUuid) return node\n\n let ancestor = getParent({ node })(record)\n while (ancestor && ancestor.nodeDefUuid !== ancestorDefUuid) {\n ancestor = getParent({ node: ancestor })(record)\n }\n return ancestor\n }\n)\n\n/**\n * Returns the list of ancestors from the given node to the root entity\n */\nexport const getAncestorsAndSelf = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode }): Array<ArenaRecordNode> => {\n const { record, node } = params\n const ancestors: Array<ArenaRecordNode> = []\n visitAncestorsAndSelf({\n node,\n visitor: (currentNode) => {\n ancestors.push(currentNode)\n },\n })(record)\n return ancestors\n }\n)\n\n// descendants\n\nexport const getDescendantsOrSelf = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode; nodeDefDescendant: NodeDef<any> }): ArenaRecordNode[] => {\n const { record, node, nodeDefDescendant } = params\n\n if (nodeDefDescendant.uuid === node.nodeDefUuid) return [node]\n\n const nodeDefDescendantFullHierarchy = [...nodeDefDescendant.meta.h, nodeDefDescendant.uuid]\n\n // 1. get the descendant node defs uuids starting from node nodeDefUuid (not inclusive) down to the specified nodeDefDescendant uuid\n const descendantNodeDefUuids = nodeDefDescendantFullHierarchy.slice(\n nodeDefDescendantFullHierarchy.indexOf(node.nodeDefUuid) + 1\n )\n // 2. for every level in the hierarchy, find the children having the nodeDefUuid equal to the current one\n let currentAncestors = [node]\n let currentDescendants: ArenaRecordNode[] = []\n for (const currentDescendantDefUuid of descendantNodeDefUuids) {\n for (const currentAncestor of currentAncestors) {\n currentDescendants.push(\n ...getChildren({ parentNode: currentAncestor, childDefUuid: currentDescendantDefUuid })(record)\n )\n }\n currentAncestors = currentDescendants\n currentDescendants = []\n }\n return currentAncestors // currentAncestors is equal to the currentDescendants of the last level\n }\n)\n\nexport const getDescendant = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode; nodeDefDescendant: NodeDef<any> }): ArenaRecordNode => {\n const { record, node, nodeDefDescendant } = params\n\n return getDescendantsOrSelf({ node, nodeDefDescendant })(record)[0]\n }\n)\n\nexport const isDescendantOf = (params: { node: ArenaRecordNode; ancestor: ArenaRecordNode }): boolean => {\n const { node, ancestor } = params\n return Nodes.getHierarchy(node).includes(ancestor.uuid)\n}\n\nexport const visitDescendantsAndSelf = recordGetter(\n (params: {\n record: ArenaRecord\n node: ArenaRecordNode\n visitor: (node: ArenaRecordNode) => boolean | void\n traverseMethod?: TraverseMethod\n }): void => {\n const { record, node, visitor, traverseMethod = TraverseMethod.bfs } = params\n\n if (traverseMethod === TraverseMethod.bfs) {\n const queue = new Queue()\n\n queue.enqueue(node)\n\n while (!queue.isEmpty()) {\n const visitedNode = queue.dequeue()\n\n if (visitor(visitedNode)) {\n // stop if visitor returns true\n return\n }\n\n const children = getChildren(visitedNode)(record)\n queue.enqueueItems(children)\n }\n } else {\n const stack = []\n\n stack.push(node)\n\n while (stack.length > 0) {\n const visitedNode = stack.pop() as ArenaRecordNode\n\n if (visitor(visitedNode)) {\n // stop if visitor returns true\n return\n }\n\n const children = getChildren({ parentNode: visitedNode })(record)\n\n // add children to stack in reverse order\n for (let index = children.length - 1; index >= 0; index--) {\n const child = children[index]\n stack.push(child)\n }\n }\n }\n }\n)\n\nexport const findDescendantOrSelf =\n (params: { node: ArenaRecordNode; predicate: (node: ArenaRecordNode) => boolean }) =>\n (record: ArenaRecord): ArenaRecordNode | undefined => {\n const { node, predicate } = params\n let found = undefined\n\n visitDescendantsAndSelf({\n node,\n visitor: (currentNode) => {\n if (predicate(currentNode)) {\n found = currentNode\n return true\n }\n return false\n },\n })(record)\n return found\n }\n\nconst getClosestAncestorNode = recordGetter(\n (params: {\n record: ArenaRecord\n node: ArenaRecordNode\n nodeDef: NodeDef<NodeDefType, NodeDefProps>\n dependentDef: NodeDef<NodeDefType, NodeDefProps>\n dependencyType: SurveyDependencyType\n }): ArenaRecordNode | undefined => {\n const { record, node, nodeDef, dependentDef, dependencyType } = params\n\n // 1a if dependent def is the same as node def, potentially all nodes with\n // nodeDefUuid === dependentDef.uuid in record could be dependent of nodeDef;\n // consider the root node as the closest ancestor node,\n // unless the node def references itself only among the children of its parent entity (e.g. validation \"dbh > 0\")\n if (nodeDef.uuid === dependentDef.uuid) {\n return NodeDefSelfReferences.isSelfReferenceLocal({ nodeDef, dependencyType })\n ? getParent({ node })(record)\n : getRoot(record)\n }\n // 1 find common ancestor def\n const commonAncestorDefUuid = Arrays.last(Arrays.intersection(nodeDef.meta.h, dependentDef.meta.h))\n if (!commonAncestorDefUuid) return undefined\n\n // 2 get ancestor node with common parent def\n return getAncestor({ node, ancestorDefUuid: commonAncestorDefUuid })(record)\n }\n)\n\ntype EntityKeyNodesGetterParams = {\n survey: Survey\n cycle?: string\n record: ArenaRecord\n entity: ArenaRecordNode\n keyDefs?: NodeDef<NodeDefType, NodeDefProps>[]\n}\n\nexport const getEntityKeyNodesByDefUuid = recordGetter((params: EntityKeyNodesGetterParams): NodesMap => {\n const { survey, cycle, record, entity, keyDefs } = params\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: entity.nodeDefUuid })\n const nodeDefKeys = keyDefs ?? Surveys.getNodeDefKeys({ survey, cycle, nodeDef })\n return nodeDefKeys.reduce((acc: NodesMap, nodeDefKey) => {\n const nodeKey = getDescendant({ node: entity, nodeDefDescendant: nodeDefKey })(record)\n acc[nodeDefKey.uuid] = nodeKey\n return acc\n }, {})\n})\n\nexport const getEntityKeyNodes = recordGetter(\n ({ record, ...otherParams }: EntityKeyNodesGetterParams): ArenaRecordNode[] =>\n Object.values(getEntityKeyNodesByDefUuid(otherParams)(record))\n)\n\nexport const getEntityKeyValuesByDefUuid = recordGetter((params: EntityKeyNodesGetterParams): Dictionary<any> => {\n const { record, ...otherParams } = params\n const keyNodesByDefUuid = getEntityKeyNodesByDefUuid(otherParams)(record)\n return Object.entries(keyNodesByDefUuid).reduce((acc: Dictionary<any>, [uuid, keyNode]) => {\n acc[uuid] = keyNode?.value\n return acc\n }, {})\n})\n\nexport const getEntityKeyValues = recordGetter(({ record, ...otherParams }: EntityKeyNodesGetterParams): any[] =>\n Object.values(getEntityKeyValuesByDefUuid(otherParams)(record))\n)\n\nexport const getEntitySiblings = recordGetter(\n (params: { record: ArenaRecord; entity: ArenaRecordNode; includeSelf?: boolean }) => {\n const { record, entity, includeSelf = false } = params\n const parentEntity = getParent({ node: entity })(record)\n if (!parentEntity) return []\n const siblingEntities = getChildren({ parentNode: parentEntity, childDefUuid: entity.nodeDefUuid })(record)\n return includeSelf ? siblingEntities : siblingEntities.filter((sibling) => !Nodes.areEqual(sibling, entity))\n }\n)\n\nexport const getAttributeSiblings = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode; nodeDef: NodeDef<NodeDefType, NodeDefProps> }) => {\n const { record, node, nodeDef } = params\n const parentEntity = getParent({ node })(record)\n if (!parentEntity) return []\n const siblingParentEntities = getEntitySiblings({ entity: parentEntity })(record)\n return siblingParentEntities.reduce((siblingsAcc: ArenaRecordNode[], siblingEntity) => {\n siblingsAcc.push(...getChildren({ parentNode: siblingEntity, childDefUuid: nodeDef.uuid })(record))\n return siblingsAcc\n }, [])\n }\n)\n\nexport const getNodeIndex = recordGetter((params: { record: ArenaRecord; node: ArenaRecordNode }) => {\n const { record, node } = params\n const parentEntity = getParent({ node })(record)\n if (!parentEntity) return 0 // root entity\n const siblings = getChildren({ parentNode: parentEntity, childDefUuid: node.nodeDefUuid })(record)\n return siblings.indexOf(node)\n})\n\nexport const findEntityByKeyValues = recordGetter(\n (params: {\n survey: Survey\n cycle: string\n record: ArenaRecord\n parentEntity: ArenaRecordNode\n entityDefUuid: string\n keyValuesByDefUuid: Dictionary<any>\n }): ArenaRecordNode | undefined => {\n const { survey, cycle, record, parentEntity, entityDefUuid, keyValuesByDefUuid } = params\n const entityDef = Surveys.getNodeDefByUuid({ survey, uuid: entityDefUuid })\n const siblingEntities = getChildren({ parentNode: parentEntity, childDefUuid: entityDefUuid })(record)\n if (NodeDefs.isSingle(entityDef)) {\n return siblingEntities[0]\n }\n const keyDefs = Surveys.getNodeDefKeys({ survey, cycle, nodeDef: entityDef })\n\n return siblingEntities.find((siblingEntity) => {\n const siblingEntityKeyValuesByDefUuid = getEntityKeyValuesByDefUuid({ survey, entity: siblingEntity, keyDefs })(\n record\n )\n return keyDefs.every((keyDef) => {\n const keyValue = siblingEntityKeyValuesByDefUuid[keyDef.uuid]\n const keyValueSearch = keyValuesByDefUuid[keyDef.uuid]\n return NodeValues.isValueEqual({\n survey,\n nodeDef: keyDef,\n value: keyValue,\n valueSearch: keyValueSearch,\n })\n })\n })\n }\n)\n\nexport const findEntityWithSameKeysInAnotherRecord = recordGetter(\n (params: {\n survey: Survey\n cycle: string\n entityUuid: string\n record: ArenaRecord\n recordOther: ArenaRecord\n }): ArenaRecordNode | undefined => {\n const { survey, cycle, entityUuid, record, recordOther } = params\n const entity = getNodeByUuid({ uuid: entityUuid })(record)\n if (!entity) return undefined\n\n let otherRecordCurrentParentEntity = getRoot(recordOther)\n if (!otherRecordCurrentParentEntity) return undefined\n\n const entityAncestorsAndSelf = getAncestorsAndSelf({ node: entity })(record)\n const ancestorDefUuidsAndKeys = entityAncestorsAndSelf.map((ancestor) => ({\n entityDefUuid: ancestor.nodeDefUuid,\n keyValuesByDefUuid: getEntityKeyValuesByDefUuid({ survey, entity: ancestor })(record),\n }))\n\n const ancestorDefUuidsAndKeysToVisit = [...ancestorDefUuidsAndKeys].reverse()\n\n for (let index = 1; otherRecordCurrentParentEntity && index < ancestorDefUuidsAndKeysToVisit.length; index++) {\n const { entityDefUuid, keyValuesByDefUuid } = ancestorDefUuidsAndKeysToVisit[index]\n otherRecordCurrentParentEntity = findEntityByKeyValues({\n survey,\n cycle,\n parentEntity: otherRecordCurrentParentEntity,\n entityDefUuid,\n keyValuesByDefUuid,\n })(recordOther)\n }\n return otherRecordCurrentParentEntity\n }\n)\n\nexport const getDependentNodePointers = recordGetter(\n (params: {\n survey: Survey\n record: ArenaRecord\n node: ArenaRecordNode\n dependencyType: SurveyDependencyType\n includeSelf?: boolean\n filterFn?: (nodePointer: NodePointer) => boolean\n }) => {\n const { survey, record, node, dependencyType, includeSelf = false, filterFn = null } = params\n const nodeDefUuid = node.nodeDefUuid\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: nodeDefUuid })\n const dependentDefs = Surveys.getNodeDefDependents({ survey, nodeDefUuid, dependencyType })\n const nodePointers: Array<NodePointer> = []\n\n const addToNodePointers = (nodePointer: NodePointer): void => {\n if (filterFn === null || filterFn(nodePointer)) {\n nodePointers.push(nodePointer)\n }\n }\n\n for (const dependentDef of dependentDefs) {\n // 1 find common ancestor node\n const commonAncestorNode = getClosestAncestorNode({ node, nodeDef, dependentDef, dependencyType })(record)\n if (!commonAncestorNode) continue\n\n const nodeDefDependentParent = Surveys.getNodeDefParent({ survey, nodeDef: dependentDef })\n if (!nodeDefDependentParent) throw new SystemError('record.nodes.dependents.dependencyOnRootFound')\n\n // 2 find descendant nodes of common parent node with nodeDefUuid = dependentDef uuid\n const dependentContextNodes = getDescendantsOrSelf({\n node: commonAncestorNode,\n nodeDefDescendant: nodeDefDependentParent,\n })(record)\n\n for (const dependentContextNode of dependentContextNodes) {\n addToNodePointers({\n nodeCtx: dependentContextNode,\n nodeDef: dependentDef,\n })\n }\n }\n if (includeSelf) {\n const parentNode = getParent({ node })(record)\n if (parentNode) {\n addToNodePointers({\n nodeCtx: parentNode,\n nodeDef,\n })\n }\n }\n\n return nodePointers\n }\n)\n\nexport const getAncestorCodePath = recordGetter(\n (params: {\n survey: Survey\n record: ArenaRecord\n parentNode: ArenaRecordNode\n nodeDef: NodeDef<NodeDefType.code, NodeDefCodeProps>\n }): string[] => {\n const { record, parentNode, nodeDef, survey } = params\n\n const getCodeAttributeItemCode = (codeAttribute: ArenaRecordNode | undefined): string => {\n const codeItemUuid = codeAttribute ? NodeValues.getItemUuid(codeAttribute) : undefined\n if (!codeItemUuid) return ''\n const item = Surveys.getCategoryItemByUuid({ survey, itemUuid: codeItemUuid })\n return item?.props.code ?? ''\n }\n\n const codePaths = []\n let currentParentCodeAttribute = getParentCodeAttribute({ parentNode, nodeDef })(record)\n\n while (currentParentCodeAttribute) {\n const ancestorItemCode = getCodeAttributeItemCode(currentParentCodeAttribute)\n codePaths.unshift(ancestorItemCode)\n const ancestorCodeDef = Surveys.getNodeDefByUuid({\n survey,\n uuid: currentParentCodeAttribute.nodeDefUuid,\n }) as NodeDefCode\n currentParentCodeAttribute = getParentCodeAttribute({ parentNode, nodeDef: ancestorCodeDef })(record)\n }\n return codePaths\n }\n)\n\nexport const getCategoryItemUuid = recordGetter(\n (params: {\n survey: Survey\n nodeDef: NodeDef<NodeDefType.code, NodeDefCodeProps>\n record: ArenaRecord\n parentNode: ArenaRecordNode\n code: string\n }): string | undefined => {\n const { survey, nodeDef, record, parentNode, code } = params\n const categoryUuid = nodeDef.props.categoryUuid\n\n const codePaths = [...getAncestorCodePath({ survey, parentNode, nodeDef })(record), code]\n\n const item = Surveys.getCategoryItemByCodePaths({ survey, categoryUuid, codePaths })\n\n return item?.uuid\n }\n)\n\nexport const isNodeFilledByUser = positionalRecordGetter({\n getter: ({ record, node }: RecordParams & { node: ArenaRecordNode }): boolean =>\n !!findDescendantOrSelf({ node, predicate: (visitedNode) => Nodes.hasUserInputValue(visitedNode) })(record),\n isPositional: isRecordNode,\n toParams: (node: ArenaRecordNode) => ({ node }),\n})\n\nexport const isNodeEmpty = positionalRecordGetter({\n getter: ({ record, node }: RecordParams & { node: ArenaRecordNode }): boolean =>\n !isNodeFilledByUser({ node })(record),\n isPositional: isRecordNode,\n toParams: (node: ArenaRecordNode) => ({ node }),\n})\n\nexport const isEmpty = (record: ArenaRecord): boolean => {\n const rootNode = getRoot(record)\n return rootNode ? isNodeEmpty({ node: rootNode })(record) : true\n}\n\nexport const getStep = (record: ArenaRecord): string => record.step ?? RECORD_STEP_DEFAULT\n\nexport const isInAnalysisStep = (record: ArenaRecord): boolean => getStep(record) === RecordStepAnalysisCode\n"]}
1
+ {"version":3,"file":"recordGetters.js","sourceRoot":"","sources":["../../../src/record/_records/recordGetters.ts"],"names":[],"mappings":"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","sourcesContent":["import { Dictionary, TraverseMethod } from '../../common'\nimport { SystemError } from '../../error'\nimport { ArenaRecordNode, NodePointer, Nodes, NodesMap } from '../../node'\nimport { NodeValues } from '../../node/nodeValues'\nimport { NodeDef, NodeDefCode, NodeDefCodeProps, NodeDefProps, NodeDefs, NodeDefType } from '../../nodeDef'\nimport { defaultCycle, Surveys } from '../../survey'\nimport { Survey, SurveyDependencyType } from '../../survey/survey'\nimport { Arrays, Queue } from '../../utils'\nimport { ArenaRecord, RECORD_STEP_DEFAULT } from '../record'\nimport { RecordStepAnalysisCode } from '../recordStep'\nimport { RecordNodesIndexReader } from './recordNodesIndexReader'\nimport { NodeDefSelfReferences } from './nodeDefSelfReferences'\n\nexport type RecordParams = { record: ArenaRecord }\n\n/**\n * Record getter: takes the parameters first and the record as separate (curried) parameter: `getter(params)(record)`.\n * The deprecated form, with the record inside the parameters (`getter({ record, ...params })`), is still supported.\n */\nexport type RecordGetter<P extends RecordParams, R> = {\n /** @deprecated Pass the record as separate parameter: `getter(params)(record)` */\n (params: P): R\n (params: Omit<P, 'record'>): (record: ArenaRecord) => R\n}\n\nconst isRecordParams = (params: object): params is RecordParams => 'record' in params\n\nconst recordGetter = <P extends RecordParams, R>(getter: (params: P) => R): RecordGetter<P, R> =>\n ((params: P | Omit<P, 'record'>) =>\n isRecordParams(params)\n ? getter(params as P)\n : (record: ArenaRecord) => getter({ ...params, record } as P)) as RecordGetter<P, R>\n\n/**\n * Record getter (with parameters object) that also supports the deprecated form with positional parameters:\n * `getter(arg1, arg2)(record)`.\n */\nexport type PositionalRecordGetter<P, A extends unknown[], R> = {\n (params: P): (record: ArenaRecord) => R\n /** @deprecated Pass the parameters as an object: `getter({ ...params })(record)` */\n (...args: A): (record: ArenaRecord) => R\n}\n\nconst positionalRecordGetter = <P, A extends unknown[], R>(params: {\n getter: (params: P & RecordParams) => R\n isPositional: (firstArg: unknown) => boolean\n toParams: (...args: A) => NoInfer<P>\n}): PositionalRecordGetter<P, A, R> => {\n const { getter, isPositional, toParams } = params\n return ((...args: unknown[]) => {\n const getterParams = isPositional(args[0]) ? toParams(...(args as A)) : (args[0] as P)\n return (record: ArenaRecord) => getter({ ...getterParams, record })\n }) as PositionalRecordGetter<P, A, R>\n}\n\nconst isRecordNode = (arg: unknown): arg is ArenaRecordNode =>\n typeof arg === 'object' && arg !== null && 'uuid' in arg && 'nodeDefUuid' in arg\nconst isString = (arg: unknown): arg is string => typeof arg === 'string'\n\nexport const getCycle = (record: ArenaRecord): string => record.cycle ?? defaultCycle\n\nexport const getNodes = (record: ArenaRecord): Dictionary<ArenaRecordNode> => record.nodes ?? {}\n\nexport const getNodesArray = (record: ArenaRecord): ArenaRecordNode[] => Object.values(getNodes(record))\n\n/**\n * Returns the node with the specified uuid, or undefined if not found.\n * Like the other node getters, it does not throw an error when the node is not found.\n */\nexport const getNodeByUuid = positionalRecordGetter({\n getter: ({ record, uuid }: RecordParams & { uuid: string }): ArenaRecordNode | undefined => record.nodes?.[uuid],\n isPositional: isString,\n toParams: (uuid: string) => ({ uuid }),\n})\n\nexport const getNodesByUuids = positionalRecordGetter({\n getter: ({ record, uuids }: RecordParams & { uuids: string[] }): ArenaRecordNode[] =>\n uuids.map((uuid: string) => record.nodes?.[uuid]) as ArenaRecordNode[],\n isPositional: Array.isArray,\n toParams: (uuids: string[]) => ({ uuids }),\n})\n\n/**\n * Returns the root node, or undefined if the record has no nodes.\n */\nexport const getRoot = (record: ArenaRecord): ArenaRecordNode | undefined => {\n const rootUuid = record._nodesIndex ? RecordNodesIndexReader.getNodeRootUuid(record._nodesIndex) : null\n if (rootUuid) {\n return getNodeByUuid({ uuid: rootUuid })(record)\n }\n return getNodesArray(record).find((node) => !node.parentUuid)\n}\n\nexport const getChildren = positionalRecordGetter({\n getter: ({\n record,\n parentNode,\n childDefUuid,\n }: RecordParams & { parentNode: ArenaRecordNode; childDefUuid?: string }): ArenaRecordNode[] => {\n if (record._nodesIndex) {\n const childrenUuids = childDefUuid\n ? RecordNodesIndexReader.getNodeUuidsByParentAndChildDef({\n parentNodeUuid: parentNode.uuid,\n childDefUuid,\n })(record._nodesIndex)\n : RecordNodesIndexReader.getNodeUuidsByParent(parentNode.uuid)(record._nodesIndex)\n return getNodesByUuids({ uuids: childrenUuids })(record)\n }\n return getNodesArray(record).filter(\n (node) => node.parentUuid === parentNode.uuid && (!childDefUuid || node.nodeDefUuid == childDefUuid)\n )\n },\n isPositional: isRecordNode,\n toParams: (parentNode: ArenaRecordNode, childDefUuid?: string) => ({ parentNode, childDefUuid }),\n})\n\n/**\n * Returns the only child of the parent node with the specified node def, or undefined if not found.\n * Throws an error if more than one child is found.\n */\nexport const getChild = positionalRecordGetter({\n getter: ({\n record,\n parentNode,\n childDefUuid,\n }: RecordParams & { parentNode: ArenaRecordNode; childDefUuid: string }): ArenaRecordNode | undefined => {\n const children = getChildren({ parentNode, childDefUuid })(record)\n if (children.length > 1) {\n const errorParams = { childDefUuid, parentNodeUuid: parentNode.uuid, recordUuid: record.uuid }\n throw new SystemError('systemError.record.multipleNodesFound', errorParams)\n }\n return children[0]\n },\n isPositional: isRecordNode,\n toParams: (parentNode: ArenaRecordNode, childDefUuid: string) => ({ parentNode, childDefUuid }),\n})\n\nexport const getParent = positionalRecordGetter({\n getter: ({ record, node }: RecordParams & { node: ArenaRecordNode }): ArenaRecordNode | undefined =>\n node.parentUuid ? getNodeByUuid({ uuid: node.parentUuid })(record) : undefined,\n isPositional: isRecordNode,\n toParams: (node: ArenaRecordNode) => ({ node }),\n})\n\nexport const getNodesByDefUuid = positionalRecordGetter({\n getter: ({ record, nodeDefUuid }: RecordParams & { nodeDefUuid: string }): ArenaRecordNode[] => {\n if (record._nodesIndex) {\n const nodeUuids = RecordNodesIndexReader.getNodeUuidsByDef(nodeDefUuid)(record._nodesIndex)\n return getNodesByUuids({ uuids: nodeUuids })(record)\n }\n return getNodesArray(record).filter((node) => node.nodeDefUuid === nodeDefUuid)\n },\n isPositional: isString,\n toParams: (nodeDefUuid: string) => ({ nodeDefUuid }),\n})\n\nconst isNodeFlagTrue = (isChildFlagTrue: (parent: ArenaRecordNode, nodeDefUuid: string) => boolean) =>\n recordGetter((params: RecordParams & { node: ArenaRecordNode }): boolean => {\n const { record, node } = params\n const ancestorsAndSelf = getAncestorsAndSelf({ node })(record)\n for (let i = 0; i < ancestorsAndSelf.length - 1; i++) {\n const child = ancestorsAndSelf[i]\n const parent = ancestorsAndSelf[i + 1]\n if (!isChildFlagTrue(parent, child.nodeDefUuid)) return false\n }\n return true\n })\n\nexport const isNodeApplicable = isNodeFlagTrue((parent, nodeDefUuid) => Nodes.isChildApplicable(parent, nodeDefUuid))\nexport const isNodeEditable = isNodeFlagTrue((parent, nodeDefUuid) => Nodes.isChildEditable(parent, nodeDefUuid))\nexport const isNodeVisible = isNodeFlagTrue((parent, nodeDefUuid) => Nodes.isChildVisible(parent, nodeDefUuid))\n\nexport const getDependentCodeAttributes = positionalRecordGetter({\n getter: ({ record, node }: RecordParams & { node: ArenaRecordNode }): ArenaRecordNode[] => {\n if (record._nodesIndex) {\n const nodeUuids = RecordNodesIndexReader.getNodeCodeDependentUuids(node.uuid)(record._nodesIndex)\n return getNodesByUuids({ uuids: nodeUuids })(record)\n }\n throw new SystemError('record.nodesIndexNotInitialized')\n },\n isPositional: isRecordNode,\n toParams: (node: ArenaRecordNode) => ({ node }),\n})\n\nexport const getParentCodeAttribute =\n (params: { parentNode: ArenaRecordNode; nodeDef: NodeDefCode }) =>\n (record: ArenaRecord): ArenaRecordNode | undefined => {\n const { parentNode, nodeDef } = params\n\n const parentCodeDefUuid = NodeDefs.getParentCodeDefUuid(nodeDef)\n if (!parentCodeDefUuid) return undefined\n\n const ancestors = getAncestorsAndSelf({ node: parentNode })(record)\n for (const ancestor of ancestors) {\n const children = getChildren({ parentNode: ancestor, childDefUuid: parentCodeDefUuid })(record)\n if (children.length === 1) {\n return children[0]\n }\n }\n return undefined\n }\n\n// ancestors\n\n/**\n * Visits the specified node and its ancestors, from the node up to the root: the visit stops when the visitor returns true.\n */\nexport const visitAncestorsAndSelf = positionalRecordGetter({\n getter: ({\n record,\n node,\n visitor,\n }: RecordParams & { node: ArenaRecordNode; visitor: (node: ArenaRecordNode) => boolean | void }): void => {\n let currentNode: ArenaRecordNode | undefined = node\n while (currentNode) {\n if (visitor(currentNode)) return\n currentNode = getParent({ node: currentNode })(record)\n }\n },\n isPositional: isRecordNode,\n // deprecated form: the visit stops when stopIfFn returns true\n toParams: (node: ArenaRecordNode, visitor: (node: ArenaRecordNode) => void, stopIfFn?: () => boolean) => ({\n node,\n visitor: (visitedNode: ArenaRecordNode): boolean => {\n visitor(visitedNode)\n return !!stopIfFn?.()\n },\n }),\n})\n\n/**\n * Returns the first node satisfying the predicate among the specified node and its ancestors (from the node up to the root).\n */\nexport const findAncestor =\n (params: { node: ArenaRecordNode; predicate: (node: ArenaRecordNode) => boolean }) =>\n (record: ArenaRecord): ArenaRecordNode | undefined => {\n const { node, predicate } = params\n let result: ArenaRecordNode | undefined = undefined\n visitAncestorsAndSelf({\n node,\n visitor: (visitedNode) => {\n if (predicate(visitedNode)) {\n result = visitedNode\n return true\n }\n return false\n },\n })(record)\n return result\n }\n\n/**\n * Returns the specified node, if it has the specified node def, or its ancestor with that node def; undefined if not found.\n */\nexport const getAncestor = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode; ancestorDefUuid: string }): ArenaRecordNode | undefined => {\n const { record, node, ancestorDefUuid } = params\n if (node.nodeDefUuid === ancestorDefUuid) return node\n\n let ancestor = getParent({ node })(record)\n while (ancestor && ancestor.nodeDefUuid !== ancestorDefUuid) {\n ancestor = getParent({ node: ancestor })(record)\n }\n return ancestor\n }\n)\n\n/**\n * Returns the list of ancestors from the given node to the root entity\n */\nexport const getAncestorsAndSelf = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode }): Array<ArenaRecordNode> => {\n const { record, node } = params\n const ancestors: Array<ArenaRecordNode> = []\n visitAncestorsAndSelf({\n node,\n visitor: (currentNode) => {\n ancestors.push(currentNode)\n },\n })(record)\n return ancestors\n }\n)\n\n// descendants\n\nexport const getDescendantsOrSelf = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode; nodeDefDescendant: NodeDef<any> }): ArenaRecordNode[] => {\n const { record, node, nodeDefDescendant } = params\n\n if (nodeDefDescendant.uuid === node.nodeDefUuid) return [node]\n\n const nodeDefDescendantFullHierarchy = [...nodeDefDescendant.meta.h, nodeDefDescendant.uuid]\n\n // 1. get the descendant node defs uuids starting from node nodeDefUuid (not inclusive) down to the specified nodeDefDescendant uuid\n const descendantNodeDefUuids = nodeDefDescendantFullHierarchy.slice(\n nodeDefDescendantFullHierarchy.indexOf(node.nodeDefUuid) + 1\n )\n // 2. for every level in the hierarchy, find the children having the nodeDefUuid equal to the current one\n let currentAncestors = [node]\n let currentDescendants: ArenaRecordNode[] = []\n for (const currentDescendantDefUuid of descendantNodeDefUuids) {\n for (const currentAncestor of currentAncestors) {\n currentDescendants.push(\n ...getChildren({ parentNode: currentAncestor, childDefUuid: currentDescendantDefUuid })(record)\n )\n }\n currentAncestors = currentDescendants\n currentDescendants = []\n }\n return currentAncestors // currentAncestors is equal to the currentDescendants of the last level\n }\n)\n\n/**\n * Returns the first descendant (or the node itself) with the specified node def, or undefined if not found.\n */\nexport const getDescendant = recordGetter(\n (params: {\n record: ArenaRecord\n node: ArenaRecordNode\n nodeDefDescendant: NodeDef<any>\n }): ArenaRecordNode | undefined => {\n const { record, node, nodeDefDescendant } = params\n\n return getDescendantsOrSelf({ node, nodeDefDescendant })(record)[0]\n }\n)\n\nexport const isDescendantOf = (params: { node: ArenaRecordNode; ancestor: ArenaRecordNode }): boolean => {\n const { node, ancestor } = params\n return Nodes.getHierarchy(node).includes(ancestor.uuid)\n}\n\nexport const visitDescendantsAndSelf = recordGetter(\n (params: {\n record: ArenaRecord\n node: ArenaRecordNode\n visitor: (node: ArenaRecordNode) => boolean | void\n traverseMethod?: TraverseMethod\n }): void => {\n const { record, node, visitor, traverseMethod = TraverseMethod.bfs } = params\n\n if (traverseMethod === TraverseMethod.bfs) {\n const queue = new Queue()\n\n queue.enqueue(node)\n\n while (!queue.isEmpty()) {\n const visitedNode = queue.dequeue()\n\n if (visitor(visitedNode)) {\n // stop if visitor returns true\n return\n }\n\n const children = getChildren(visitedNode)(record)\n queue.enqueueItems(children)\n }\n } else {\n const stack = []\n\n stack.push(node)\n\n while (stack.length > 0) {\n const visitedNode = stack.pop() as ArenaRecordNode\n\n if (visitor(visitedNode)) {\n // stop if visitor returns true\n return\n }\n\n const children = getChildren({ parentNode: visitedNode })(record)\n\n // add children to stack in reverse order\n for (let index = children.length - 1; index >= 0; index--) {\n const child = children[index]\n stack.push(child)\n }\n }\n }\n }\n)\n\nexport const findDescendantOrSelf =\n (params: { node: ArenaRecordNode; predicate: (node: ArenaRecordNode) => boolean }) =>\n (record: ArenaRecord): ArenaRecordNode | undefined => {\n const { node, predicate } = params\n let found = undefined\n\n visitDescendantsAndSelf({\n node,\n visitor: (currentNode) => {\n if (predicate(currentNode)) {\n found = currentNode\n return true\n }\n return false\n },\n })(record)\n return found\n }\n\nconst getClosestAncestorNode = recordGetter(\n (params: {\n record: ArenaRecord\n node: ArenaRecordNode\n nodeDef: NodeDef<NodeDefType, NodeDefProps>\n dependentDef: NodeDef<NodeDefType, NodeDefProps>\n dependencyType: SurveyDependencyType\n }): ArenaRecordNode | undefined => {\n const { record, node, nodeDef, dependentDef, dependencyType } = params\n\n // 1a if dependent def is the same as node def, potentially all nodes with\n // nodeDefUuid === dependentDef.uuid in record could be dependent of nodeDef;\n // consider the root node as the closest ancestor node,\n // unless the node def references itself only among the children of its parent entity (e.g. validation \"dbh > 0\")\n if (nodeDef.uuid === dependentDef.uuid) {\n return NodeDefSelfReferences.isSelfReferenceLocal({ nodeDef, dependencyType })\n ? getParent({ node })(record)\n : getRoot(record)\n }\n // 1 find common ancestor def\n const commonAncestorDefUuid = Arrays.last(Arrays.intersection(nodeDef.meta.h, dependentDef.meta.h))\n if (!commonAncestorDefUuid) return undefined\n\n // 2 get ancestor node with common parent def\n return getAncestor({ node, ancestorDefUuid: commonAncestorDefUuid })(record)\n }\n)\n\ntype EntityKeyNodesGetterParams = {\n survey: Survey\n cycle?: string\n record: ArenaRecord\n entity: ArenaRecordNode\n keyDefs?: NodeDef<NodeDefType, NodeDefProps>[]\n}\n\nexport const getEntityKeyNodesByDefUuid = recordGetter((params: EntityKeyNodesGetterParams): NodesMap => {\n const { survey, cycle, record, entity, keyDefs } = params\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: entity.nodeDefUuid })\n const nodeDefKeys = keyDefs ?? Surveys.getNodeDefKeys({ survey, cycle, nodeDef })\n return nodeDefKeys.reduce((acc: NodesMap, nodeDefKey) => {\n const nodeKey = getDescendant({ node: entity, nodeDefDescendant: nodeDefKey })(record)\n // missing key nodes are kept as undefined entries\n acc[nodeDefKey.uuid] = nodeKey as ArenaRecordNode\n return acc\n }, {})\n})\n\nexport const getEntityKeyNodes = recordGetter(\n ({ record, ...otherParams }: EntityKeyNodesGetterParams): ArenaRecordNode[] =>\n Object.values(getEntityKeyNodesByDefUuid(otherParams)(record))\n)\n\nexport const getEntityKeyValuesByDefUuid = recordGetter((params: EntityKeyNodesGetterParams): Dictionary<any> => {\n const { record, ...otherParams } = params\n const keyNodesByDefUuid = getEntityKeyNodesByDefUuid(otherParams)(record)\n return Object.entries(keyNodesByDefUuid).reduce((acc: Dictionary<any>, [uuid, keyNode]) => {\n acc[uuid] = keyNode?.value\n return acc\n }, {})\n})\n\nexport const getEntityKeyValues = recordGetter(({ record, ...otherParams }: EntityKeyNodesGetterParams): any[] =>\n Object.values(getEntityKeyValuesByDefUuid(otherParams)(record))\n)\n\nexport const getEntitySiblings = recordGetter(\n (params: { record: ArenaRecord; entity: ArenaRecordNode; includeSelf?: boolean }) => {\n const { record, entity, includeSelf = false } = params\n const parentEntity = getParent({ node: entity })(record)\n if (!parentEntity) return []\n const siblingEntities = getChildren({ parentNode: parentEntity, childDefUuid: entity.nodeDefUuid })(record)\n return includeSelf ? siblingEntities : siblingEntities.filter((sibling) => !Nodes.areEqual(sibling, entity))\n }\n)\n\nexport const getAttributeSiblings = recordGetter(\n (params: { record: ArenaRecord; node: ArenaRecordNode; nodeDef: NodeDef<NodeDefType, NodeDefProps> }) => {\n const { record, node, nodeDef } = params\n const parentEntity = getParent({ node })(record)\n if (!parentEntity) return []\n const siblingParentEntities = getEntitySiblings({ entity: parentEntity })(record)\n return siblingParentEntities.reduce((siblingsAcc: ArenaRecordNode[], siblingEntity) => {\n siblingsAcc.push(...getChildren({ parentNode: siblingEntity, childDefUuid: nodeDef.uuid })(record))\n return siblingsAcc\n }, [])\n }\n)\n\nexport const getNodeIndex = recordGetter((params: { record: ArenaRecord; node: ArenaRecordNode }) => {\n const { record, node } = params\n const parentEntity = getParent({ node })(record)\n if (!parentEntity) return 0 // root entity\n const siblings = getChildren({ parentNode: parentEntity, childDefUuid: node.nodeDefUuid })(record)\n return siblings.indexOf(node)\n})\n\nexport const findEntityByKeyValues = recordGetter(\n (params: {\n survey: Survey\n cycle: string\n record: ArenaRecord\n parentEntity: ArenaRecordNode\n entityDefUuid: string\n keyValuesByDefUuid: Dictionary<any>\n }): ArenaRecordNode | undefined => {\n const { survey, cycle, record, parentEntity, entityDefUuid, keyValuesByDefUuid } = params\n const entityDef = Surveys.getNodeDefByUuid({ survey, uuid: entityDefUuid })\n const siblingEntities = getChildren({ parentNode: parentEntity, childDefUuid: entityDefUuid })(record)\n if (NodeDefs.isSingle(entityDef)) {\n return siblingEntities[0]\n }\n const keyDefs = Surveys.getNodeDefKeys({ survey, cycle, nodeDef: entityDef })\n\n return siblingEntities.find((siblingEntity) => {\n const siblingEntityKeyValuesByDefUuid = getEntityKeyValuesByDefUuid({ survey, entity: siblingEntity, keyDefs })(\n record\n )\n return keyDefs.every((keyDef) => {\n const keyValue = siblingEntityKeyValuesByDefUuid[keyDef.uuid]\n const keyValueSearch = keyValuesByDefUuid[keyDef.uuid]\n return NodeValues.isValueEqual({\n survey,\n nodeDef: keyDef,\n value: keyValue,\n valueSearch: keyValueSearch,\n })\n })\n })\n }\n)\n\nexport const findEntityWithSameKeysInAnotherRecord = recordGetter(\n (params: {\n survey: Survey\n cycle: string\n entityUuid: string\n record: ArenaRecord\n recordOther: ArenaRecord\n }): ArenaRecordNode | undefined => {\n const { survey, cycle, entityUuid, record, recordOther } = params\n const entity = getNodeByUuid({ uuid: entityUuid })(record)\n if (!entity) return undefined\n\n let otherRecordCurrentParentEntity = getRoot(recordOther)\n if (!otherRecordCurrentParentEntity) return undefined\n\n const entityAncestorsAndSelf = getAncestorsAndSelf({ node: entity })(record)\n const ancestorDefUuidsAndKeys = entityAncestorsAndSelf.map((ancestor) => ({\n entityDefUuid: ancestor.nodeDefUuid,\n keyValuesByDefUuid: getEntityKeyValuesByDefUuid({ survey, entity: ancestor })(record),\n }))\n\n const ancestorDefUuidsAndKeysToVisit = [...ancestorDefUuidsAndKeys].reverse()\n\n for (let index = 1; otherRecordCurrentParentEntity && index < ancestorDefUuidsAndKeysToVisit.length; index++) {\n const { entityDefUuid, keyValuesByDefUuid } = ancestorDefUuidsAndKeysToVisit[index]\n otherRecordCurrentParentEntity = findEntityByKeyValues({\n survey,\n cycle,\n parentEntity: otherRecordCurrentParentEntity,\n entityDefUuid,\n keyValuesByDefUuid,\n })(recordOther)\n }\n return otherRecordCurrentParentEntity\n }\n)\n\nexport const getDependentNodePointers = recordGetter(\n (params: {\n survey: Survey\n record: ArenaRecord\n node: ArenaRecordNode\n dependencyType: SurveyDependencyType\n includeSelf?: boolean\n filterFn?: (nodePointer: NodePointer) => boolean\n }) => {\n const { survey, record, node, dependencyType, includeSelf = false, filterFn = null } = params\n const nodeDefUuid = node.nodeDefUuid\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: nodeDefUuid })\n const dependentDefs = Surveys.getNodeDefDependents({ survey, nodeDefUuid, dependencyType })\n const nodePointers: Array<NodePointer> = []\n\n const addToNodePointers = (nodePointer: NodePointer): void => {\n if (filterFn === null || filterFn(nodePointer)) {\n nodePointers.push(nodePointer)\n }\n }\n\n for (const dependentDef of dependentDefs) {\n // 1 find common ancestor node\n const commonAncestorNode = getClosestAncestorNode({ node, nodeDef, dependentDef, dependencyType })(record)\n if (!commonAncestorNode) continue\n\n const nodeDefDependentParent = Surveys.getNodeDefParent({ survey, nodeDef: dependentDef })\n if (!nodeDefDependentParent) throw new SystemError('record.nodes.dependents.dependencyOnRootFound')\n\n // 2 find descendant nodes of common parent node with nodeDefUuid = dependentDef uuid\n const dependentContextNodes = getDescendantsOrSelf({\n node: commonAncestorNode,\n nodeDefDescendant: nodeDefDependentParent,\n })(record)\n\n for (const dependentContextNode of dependentContextNodes) {\n addToNodePointers({\n nodeCtx: dependentContextNode,\n nodeDef: dependentDef,\n })\n }\n }\n if (includeSelf) {\n const parentNode = getParent({ node })(record)\n if (parentNode) {\n addToNodePointers({\n nodeCtx: parentNode,\n nodeDef,\n })\n }\n }\n\n return nodePointers\n }\n)\n\nexport const getAncestorCodePath = recordGetter(\n (params: {\n survey: Survey\n record: ArenaRecord\n parentNode: ArenaRecordNode\n nodeDef: NodeDef<NodeDefType.code, NodeDefCodeProps>\n }): string[] => {\n const { record, parentNode, nodeDef, survey } = params\n\n const getCodeAttributeItemCode = (codeAttribute: ArenaRecordNode | undefined): string => {\n const codeItemUuid = codeAttribute ? NodeValues.getItemUuid(codeAttribute) : undefined\n if (!codeItemUuid) return ''\n const item = Surveys.getCategoryItemByUuid({ survey, itemUuid: codeItemUuid })\n return item?.props.code ?? ''\n }\n\n const codePaths = []\n let currentParentCodeAttribute = getParentCodeAttribute({ parentNode, nodeDef })(record)\n\n while (currentParentCodeAttribute) {\n const ancestorItemCode = getCodeAttributeItemCode(currentParentCodeAttribute)\n codePaths.unshift(ancestorItemCode)\n const ancestorCodeDef = Surveys.getNodeDefByUuid({\n survey,\n uuid: currentParentCodeAttribute.nodeDefUuid,\n }) as NodeDefCode\n currentParentCodeAttribute = getParentCodeAttribute({ parentNode, nodeDef: ancestorCodeDef })(record)\n }\n return codePaths\n }\n)\n\nexport const getCategoryItemUuid = recordGetter(\n (params: {\n survey: Survey\n nodeDef: NodeDef<NodeDefType.code, NodeDefCodeProps>\n record: ArenaRecord\n parentNode: ArenaRecordNode\n code: string\n }): string | undefined => {\n const { survey, nodeDef, record, parentNode, code } = params\n const categoryUuid = nodeDef.props.categoryUuid\n\n const codePaths = [...getAncestorCodePath({ survey, parentNode, nodeDef })(record), code]\n\n const item = Surveys.getCategoryItemByCodePaths({ survey, categoryUuid, codePaths })\n\n return item?.uuid\n }\n)\n\nexport const isNodeFilledByUser = positionalRecordGetter({\n getter: ({ record, node }: RecordParams & { node: ArenaRecordNode }): boolean =>\n !!findDescendantOrSelf({ node, predicate: (visitedNode) => Nodes.hasUserInputValue(visitedNode) })(record),\n isPositional: isRecordNode,\n toParams: (node: ArenaRecordNode) => ({ node }),\n})\n\nexport const isNodeEmpty = positionalRecordGetter({\n getter: ({ record, node }: RecordParams & { node: ArenaRecordNode }): boolean =>\n !isNodeFilledByUser({ node })(record),\n isPositional: isRecordNode,\n toParams: (node: ArenaRecordNode) => ({ node }),\n})\n\nexport const isEmpty = (record: ArenaRecord): boolean => {\n const rootNode = getRoot(record)\n return rootNode ? isNodeEmpty({ node: rootNode })(record) : true\n}\n\nexport const getStep = (record: ArenaRecord): string => record.step ?? RECORD_STEP_DEFAULT\n\nexport const isInAnalysisStep = (record: ArenaRecord): boolean => getStep(record) === RecordStepAnalysisCode\n"]}
@@ -26,8 +26,10 @@ const shouldExistingEntitiesBeDeleted = (params) => __awaiter(void 0, void 0, vo
26
26
  const enumeratorDef = survey_1.Surveys.getNodeDefEnumerator({ survey, entityDef });
27
27
  const existingEnumeratingItemUuids = existingEntities
28
28
  .map((existingEntity) => {
29
+ var _a;
29
30
  const existingEnumerator = (0, recordGetters_1.getChild)({ parentNode: existingEntity, childDefUuid: enumeratorDef.uuid })(updateResult.record);
30
- return node_1.NodeValues.getItemUuid(existingEnumerator);
31
+ // an entity without enumerator item makes the lists differ, so the entities are recreated
32
+ return (_a = (existingEnumerator ? node_1.NodeValues.getItemUuid(existingEnumerator) : undefined)) !== null && _a !== void 0 ? _a : '';
31
33
  })
32
34
  .sort(uuidsCompare);
33
35
  const allowedCodes = yield (0, recordEnumeratingItemsExpressionEvaluator_1.getEnumeratingItemsAllowedCodes)({
@@ -1 +1 @@
1
- {"version":3,"file":"recordNodeDependentsEnumeratedEntitiesUpdater.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArenaRecordNode, Nodes, NodeValues } from '../../node'\nimport { NodeDefCode, NodeDefEntity, NodeDefType } from '../../nodeDef'\nimport { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider'\nimport { Survey, Surveys } from '../../survey'\nimport { Objects } from '../../utils'\nimport { getAncestor, getChild, getChildren } from '../_records/recordGetters'\nimport { getEnumeratingCategoryItems } from '../_records/recordUtils'\nimport { getEnumeratingItemsAllowedCodes } from './recordEnumeratingItemsExpressionEvaluator'\nimport { RecordExpressionEvaluationContext } from './recordExpressionEvaluationContext'\nimport { RecordNodeDependentsUpdateParams } from './recordNodeDependentsUpdateParams'\nimport { createEnumeratedEntityNodes } from './recordNodesCreator'\nimport { deleteNodes } from './recordNodesDeleter'\nimport { RecordUpdateResult } from './recordUpdateResult'\n\nconst uuidsCompare = (uuidA: string, uuidB: string): number => uuidA.localeCompare(uuidB)\n\nconst shouldExistingEntitiesBeDeleted = async (params: {\n survey: Survey\n entityDef: NodeDefEntity\n existingEntities: ArenaRecordNode[]\n parentNode: ArenaRecordNode\n updateResult: RecordUpdateResult\n categoryItemProvider?: CategoryItemProvider\n user: RecordExpressionEvaluationContext['user']\n}) => {\n const { survey, entityDef, existingEntities, parentNode, updateResult, categoryItemProvider, user } = params\n const enumeratorDef = Surveys.getNodeDefEnumerator({ survey, entityDef })!\n const existingEnumeratingItemUuids = existingEntities\n .map((existingEntity) => {\n const existingEnumerator = getChild({ parentNode: existingEntity, childDefUuid: enumeratorDef.uuid })(\n updateResult.record\n )\n return NodeValues.getItemUuid(existingEnumerator)!\n })\n .sort(uuidsCompare)\n\n const allowedCodes = await getEnumeratingItemsAllowedCodes({\n survey,\n user,\n record: updateResult.record,\n entityDef,\n parentNode,\n })\n\n const enumeratingCategoryItems = await getEnumeratingCategoryItems({\n survey,\n enumeratorDef,\n parentNode,\n categoryItemProvider,\n allowedCodes,\n })(updateResult.record)\n const newEnumeratingItemUuids = enumeratingCategoryItems.map((item) => item.uuid).sort(uuidsCompare)\n\n return !Objects.isEqual(newEnumeratingItemUuids, existingEnumeratingItemUuids)\n}\n\nexport const createOrDeleteEnumeratedEntities = async (\n params: RecordExpressionEvaluationContext & {\n parentNode: ArenaRecordNode\n entityDef: NodeDefEntity\n updateResult: RecordUpdateResult\n }\n) => {\n const { survey, parentNode, entityDef, categoryItemProvider, updateResult, sideEffect } = params\n const recordUpdateOptions = { sideEffect }\n const existingEntities = getChildren({ parentNode, childDefUuid: entityDef.uuid })(updateResult.record)\n const existingEntitiesCount = existingEntities.length\n const hasExistingEntities = existingEntitiesCount > 0\n const applicable = Nodes.isChildApplicable(parentNode, entityDef.uuid)\n\n const deleteExistingEntities = () => {\n const existingEntityUuids = existingEntities.map((node) => node.uuid)\n const nodesDeleteUpdatedResult = deleteNodes(existingEntityUuids, recordUpdateOptions)(updateResult.record)\n updateResult.merge(nodesDeleteUpdatedResult)\n }\n\n if (applicable) {\n if (hasExistingEntities) {\n const existingEntitiesToBeDeleted = await shouldExistingEntitiesBeDeleted({\n survey,\n entityDef,\n existingEntities,\n parentNode,\n updateResult,\n categoryItemProvider,\n user: params.user,\n })\n if (!existingEntitiesToBeDeleted) {\n // existing entities already match the enumerating items: nothing to do (do not create them again)\n return\n }\n deleteExistingEntities()\n }\n await createEnumeratedEntityNodes({ ...params, nodeDef: entityDef, parentNode })\n } else if (hasExistingEntities) {\n deleteExistingEntities()\n }\n}\n\nexport const updateDependentEnumeratedEntities = async (\n params: RecordNodeDependentsUpdateParams\n): Promise<RecordUpdateResult> => {\n const { survey, record, node } = params\n\n const updateResult = new RecordUpdateResult({ record })\n\n // 1. get dependent enumerated entities\n const { nodeDefUuid } = node\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: nodeDefUuid })\n if (nodeDef.type !== NodeDefType.code) return updateResult\n const codeDef = nodeDef as NodeDefCode\n\n const dependentEnumeratedEntityDefs = Surveys.getDependentEnumeratedEntityDefs({ survey, nodeDef: codeDef })\n if (dependentEnumeratedEntityDefs.length === 0) return updateResult\n\n const ancestorMultipleEntityDef = Surveys.getNodeDefAncestorMultipleEntity({ survey, nodeDef })!\n const ancestorMultipleEntity = getAncestor({ node, ancestorDefUuid: ancestorMultipleEntityDef.uuid })(record)!\n\n // 2. update enumerated entities\n for (const entityDef of dependentEnumeratedEntityDefs) {\n // sequential: each iteration updates the record\n await createOrDeleteEnumeratedEntities({ ...params, entityDef, parentNode: ancestorMultipleEntity, updateResult }) // NOSONAR\n }\n return updateResult\n}\n"]}
1
+ {"version":3,"file":"recordNodeDependentsEnumeratedEntitiesUpdater.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArenaRecordNode, Nodes, NodeValues } from '../../node'\nimport { NodeDefCode, NodeDefEntity, NodeDefType } from '../../nodeDef'\nimport { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider'\nimport { Survey, Surveys } from '../../survey'\nimport { Objects } from '../../utils'\nimport { getAncestor, getChild, getChildren } from '../_records/recordGetters'\nimport { getEnumeratingCategoryItems } from '../_records/recordUtils'\nimport { getEnumeratingItemsAllowedCodes } from './recordEnumeratingItemsExpressionEvaluator'\nimport { RecordExpressionEvaluationContext } from './recordExpressionEvaluationContext'\nimport { RecordNodeDependentsUpdateParams } from './recordNodeDependentsUpdateParams'\nimport { createEnumeratedEntityNodes } from './recordNodesCreator'\nimport { deleteNodes } from './recordNodesDeleter'\nimport { RecordUpdateResult } from './recordUpdateResult'\n\nconst uuidsCompare = (uuidA: string, uuidB: string): number => uuidA.localeCompare(uuidB)\n\nconst shouldExistingEntitiesBeDeleted = async (params: {\n survey: Survey\n entityDef: NodeDefEntity\n existingEntities: ArenaRecordNode[]\n parentNode: ArenaRecordNode\n updateResult: RecordUpdateResult\n categoryItemProvider?: CategoryItemProvider\n user: RecordExpressionEvaluationContext['user']\n}) => {\n const { survey, entityDef, existingEntities, parentNode, updateResult, categoryItemProvider, user } = params\n const enumeratorDef = Surveys.getNodeDefEnumerator({ survey, entityDef })!\n const existingEnumeratingItemUuids = existingEntities\n .map((existingEntity) => {\n const existingEnumerator = getChild({ parentNode: existingEntity, childDefUuid: enumeratorDef.uuid })(\n updateResult.record\n )\n // an entity without enumerator item makes the lists differ, so the entities are recreated\n return (existingEnumerator ? NodeValues.getItemUuid(existingEnumerator) : undefined) ?? ''\n })\n .sort(uuidsCompare)\n\n const allowedCodes = await getEnumeratingItemsAllowedCodes({\n survey,\n user,\n record: updateResult.record,\n entityDef,\n parentNode,\n })\n\n const enumeratingCategoryItems = await getEnumeratingCategoryItems({\n survey,\n enumeratorDef,\n parentNode,\n categoryItemProvider,\n allowedCodes,\n })(updateResult.record)\n const newEnumeratingItemUuids = enumeratingCategoryItems.map((item) => item.uuid).sort(uuidsCompare)\n\n return !Objects.isEqual(newEnumeratingItemUuids, existingEnumeratingItemUuids)\n}\n\nexport const createOrDeleteEnumeratedEntities = async (\n params: RecordExpressionEvaluationContext & {\n parentNode: ArenaRecordNode\n entityDef: NodeDefEntity\n updateResult: RecordUpdateResult\n }\n) => {\n const { survey, parentNode, entityDef, categoryItemProvider, updateResult, sideEffect } = params\n const recordUpdateOptions = { sideEffect }\n const existingEntities = getChildren({ parentNode, childDefUuid: entityDef.uuid })(updateResult.record)\n const existingEntitiesCount = existingEntities.length\n const hasExistingEntities = existingEntitiesCount > 0\n const applicable = Nodes.isChildApplicable(parentNode, entityDef.uuid)\n\n const deleteExistingEntities = () => {\n const existingEntityUuids = existingEntities.map((node) => node.uuid)\n const nodesDeleteUpdatedResult = deleteNodes(existingEntityUuids, recordUpdateOptions)(updateResult.record)\n updateResult.merge(nodesDeleteUpdatedResult)\n }\n\n if (applicable) {\n if (hasExistingEntities) {\n const existingEntitiesToBeDeleted = await shouldExistingEntitiesBeDeleted({\n survey,\n entityDef,\n existingEntities,\n parentNode,\n updateResult,\n categoryItemProvider,\n user: params.user,\n })\n if (!existingEntitiesToBeDeleted) {\n // existing entities already match the enumerating items: nothing to do (do not create them again)\n return\n }\n deleteExistingEntities()\n }\n await createEnumeratedEntityNodes({ ...params, nodeDef: entityDef, parentNode })\n } else if (hasExistingEntities) {\n deleteExistingEntities()\n }\n}\n\nexport const updateDependentEnumeratedEntities = async (\n params: RecordNodeDependentsUpdateParams\n): Promise<RecordUpdateResult> => {\n const { survey, record, node } = params\n\n const updateResult = new RecordUpdateResult({ record })\n\n // 1. get dependent enumerated entities\n const { nodeDefUuid } = node\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: nodeDefUuid })\n if (nodeDef.type !== NodeDefType.code) return updateResult\n const codeDef = nodeDef as NodeDefCode\n\n const dependentEnumeratedEntityDefs = Surveys.getDependentEnumeratedEntityDefs({ survey, nodeDef: codeDef })\n if (dependentEnumeratedEntityDefs.length === 0) return updateResult\n\n const ancestorMultipleEntityDef = Surveys.getNodeDefAncestorMultipleEntity({ survey, nodeDef })!\n const ancestorMultipleEntity = getAncestor({ node, ancestorDefUuid: ancestorMultipleEntityDef.uuid })(record)!\n\n // 2. update enumerated entities\n for (const entityDef of dependentEnumeratedEntityDefs) {\n // sequential: each iteration updates the record\n await createOrDeleteEnumeratedEntities({ ...params, entityDef, parentNode: ancestorMultipleEntity, updateResult }) // NOSONAR\n }\n return updateResult\n}\n"]}
@@ -91,7 +91,7 @@ const syncEnumeratingItemsEntities = (params) => __awaiter(void 0, void 0, void
91
91
  const existingItemUuids = new Set();
92
92
  for (const existingEntity of existingEntities) {
93
93
  const existingEnumerator = (0, recordGetters_1.getChild)({ parentNode: existingEntity, childDefUuid: enumeratorDef.uuid })(updateResult.record);
94
- const itemUuid = node_1.NodeValues.getItemUuid(existingEnumerator);
94
+ const itemUuid = existingEnumerator ? node_1.NodeValues.getItemUuid(existingEnumerator) : undefined;
95
95
  if (!itemUuid || !targetItemUuids.has(itemUuid)) {
96
96
  const nodesDeleteUpdatedResult = (0, recordNodesDeleter_1.deleteNodes)([existingEntity.uuid], recordUpdateOptions)(updateResult.record);
97
97
  updateResult.merge(nodesDeleteUpdatedResult);
@@ -1 +1 @@
1
- {"version":3,"file":"recordNodeDependentsEnumeratingItemsUpdater.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArenaRecordNode, NodePointer, Nodes, NodeValues } from '../../node'\nimport { NodeDefEntity, NodeDefs } from '../../nodeDef'\nimport { Survey, Surveys } from '../../survey'\nimport { SurveyDependencyType } from '../../survey/survey'\nimport { getChild, getChildren, getRoot } from '../_records/recordGetters'\nimport { ArenaRecord } from '../record'\nimport { Records } from '../records'\nimport { getEnumeratingCategoryItems } from '../_records/recordUtils'\nimport { getEnumeratingItemsAllowedCodes } from './recordEnumeratingItemsExpressionEvaluator'\nimport { RecordNodeDependentsUpdateParams } from './recordNodeDependentsUpdateParams'\nimport { createEnumeratedEntityNode } from './recordNodesCreator'\nimport { deleteNodes } from './recordNodesDeleter'\nimport { RecordUpdateResult } from './recordUpdateResult'\n\nconst getEnumeratingItemsNodePointers = (params: {\n survey: Survey\n record: ArenaRecord\n node: ArenaRecordNode\n}): NodePointer[] => {\n const { survey, record, node } = params\n const nodePointers = Records.getDependentNodePointers({\n survey,\n node,\n dependencyType: SurveyDependencyType.enumeratingItems,\n })(record)\n\n if (nodePointers.length > 0 || !node.deleted) {\n return nodePointers\n }\n\n const dependentDefs = Surveys.getNodeDefDependents({\n survey,\n nodeDefUuid: node.nodeDefUuid,\n dependencyType: SurveyDependencyType.enumeratingItems,\n })\n const root = getRoot(record)\n if (!root) {\n return nodePointers\n }\n\n for (const dependentDef of dependentDefs) {\n if (!NodeDefs.isEntity(dependentDef) || !NodeDefs.getEnumeratingItemsExpression(dependentDef as NodeDefEntity)) {\n continue\n }\n const parentDef = Surveys.getNodeDefParent({ survey, nodeDef: dependentDef })\n if (!parentDef) continue\n\n const contextNodes = Records.getDescendantsOrSelf({ node: root, nodeDefDescendant: parentDef })(record)\n for (const contextNode of contextNodes) {\n nodePointers.push({ nodeCtx: contextNode, nodeDef: dependentDef })\n }\n }\n\n return nodePointers\n}\n\nexport const syncEnumeratingItemsEntities = async (\n params: RecordNodeDependentsUpdateParams & {\n parentNode: ArenaRecordNode\n entityDef: NodeDefEntity\n updateResult: RecordUpdateResult\n }\n): Promise<void> => {\n const { survey, user, parentNode, entityDef, categoryItemProvider, updateResult, sideEffect } = params\n const recordUpdateOptions = { sideEffect }\n const existingEntities = getChildren({ parentNode, childDefUuid: entityDef.uuid })(updateResult.record)\n const applicable = Nodes.isChildApplicable(parentNode, entityDef.uuid)\n\n const deleteExistingEntities = () => {\n const existingEntityUuids = existingEntities.map((node) => node.uuid)\n const nodesDeleteUpdatedResult = deleteNodes(existingEntityUuids, recordUpdateOptions)(updateResult.record)\n updateResult.merge(nodesDeleteUpdatedResult)\n }\n\n if (!applicable) {\n if (existingEntities.length > 0) {\n deleteExistingEntities()\n }\n return\n }\n\n const enumeratorDef = Surveys.getNodeDefEnumerator({ survey, entityDef })\n if (!enumeratorDef) return\n\n const allowedCodes = await getEnumeratingItemsAllowedCodes({\n survey,\n user,\n record: updateResult.record,\n entityDef,\n parentNode,\n })\n\n const categoryItems = await getEnumeratingCategoryItems({\n survey,\n enumeratorDef,\n parentNode,\n categoryItemProvider,\n allowedCodes,\n })(updateResult.record)\n\n const targetItemUuids = new Set(categoryItems.map((item) => item.uuid))\n const existingItemUuids = new Set<string>()\n\n for (const existingEntity of existingEntities) {\n const existingEnumerator = getChild({ parentNode: existingEntity, childDefUuid: enumeratorDef.uuid })(\n updateResult.record\n )\n const itemUuid = NodeValues.getItemUuid(existingEnumerator)\n if (!itemUuid || !targetItemUuids.has(itemUuid)) {\n const nodesDeleteUpdatedResult = deleteNodes([existingEntity.uuid], recordUpdateOptions)(updateResult.record)\n updateResult.merge(nodesDeleteUpdatedResult)\n } else {\n existingItemUuids.add(itemUuid)\n }\n }\n\n for (const categoryItem of categoryItems) {\n if (!existingItemUuids.has(categoryItem.uuid)) {\n const createParams = {\n user,\n survey,\n parentNode,\n nodeDef: entityDef,\n enumeratorDef,\n categoryItem,\n updateResult,\n sideEffect,\n }\n // create entities sequentially: every iteration updates the record\n await createEnumeratedEntityNode(createParams) // NOSONAR\n }\n }\n}\n\nexport const updateDependentEnumeratingItemsEntities = async (\n params: RecordNodeDependentsUpdateParams\n): Promise<RecordUpdateResult> => {\n const { survey, record, node } = params\n\n const updateResult = new RecordUpdateResult({ record })\n\n const nodePointers = getEnumeratingItemsNodePointers({ survey, record, node })\n\n for (const nodePointer of nodePointers) {\n const { nodeCtx: parentNode, nodeDef } = nodePointer\n if (!NodeDefs.isEntity(nodeDef)) continue\n\n const entityDef = nodeDef as NodeDefEntity\n if (!NodeDefs.isEnumerate(entityDef)) continue\n if (!NodeDefs.getEnumeratingItemsExpression(entityDef)) continue\n\n // sequential: each iteration updates the record\n await syncEnumeratingItemsEntities({ ...params, parentNode, entityDef, updateResult }) // NOSONAR\n }\n\n return updateResult\n}\n"]}
1
+ {"version":3,"file":"recordNodeDependentsEnumeratingItemsUpdater.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArenaRecordNode, NodePointer, Nodes, NodeValues } from '../../node'\nimport { NodeDefEntity, NodeDefs } from '../../nodeDef'\nimport { Survey, Surveys } from '../../survey'\nimport { SurveyDependencyType } from '../../survey/survey'\nimport { getChild, getChildren, getRoot } from '../_records/recordGetters'\nimport { ArenaRecord } from '../record'\nimport { Records } from '../records'\nimport { getEnumeratingCategoryItems } from '../_records/recordUtils'\nimport { getEnumeratingItemsAllowedCodes } from './recordEnumeratingItemsExpressionEvaluator'\nimport { RecordNodeDependentsUpdateParams } from './recordNodeDependentsUpdateParams'\nimport { createEnumeratedEntityNode } from './recordNodesCreator'\nimport { deleteNodes } from './recordNodesDeleter'\nimport { RecordUpdateResult } from './recordUpdateResult'\n\nconst getEnumeratingItemsNodePointers = (params: {\n survey: Survey\n record: ArenaRecord\n node: ArenaRecordNode\n}): NodePointer[] => {\n const { survey, record, node } = params\n const nodePointers = Records.getDependentNodePointers({\n survey,\n node,\n dependencyType: SurveyDependencyType.enumeratingItems,\n })(record)\n\n if (nodePointers.length > 0 || !node.deleted) {\n return nodePointers\n }\n\n const dependentDefs = Surveys.getNodeDefDependents({\n survey,\n nodeDefUuid: node.nodeDefUuid,\n dependencyType: SurveyDependencyType.enumeratingItems,\n })\n const root = getRoot(record)\n if (!root) {\n return nodePointers\n }\n\n for (const dependentDef of dependentDefs) {\n if (!NodeDefs.isEntity(dependentDef) || !NodeDefs.getEnumeratingItemsExpression(dependentDef as NodeDefEntity)) {\n continue\n }\n const parentDef = Surveys.getNodeDefParent({ survey, nodeDef: dependentDef })\n if (!parentDef) continue\n\n const contextNodes = Records.getDescendantsOrSelf({ node: root, nodeDefDescendant: parentDef })(record)\n for (const contextNode of contextNodes) {\n nodePointers.push({ nodeCtx: contextNode, nodeDef: dependentDef })\n }\n }\n\n return nodePointers\n}\n\nexport const syncEnumeratingItemsEntities = async (\n params: RecordNodeDependentsUpdateParams & {\n parentNode: ArenaRecordNode\n entityDef: NodeDefEntity\n updateResult: RecordUpdateResult\n }\n): Promise<void> => {\n const { survey, user, parentNode, entityDef, categoryItemProvider, updateResult, sideEffect } = params\n const recordUpdateOptions = { sideEffect }\n const existingEntities = getChildren({ parentNode, childDefUuid: entityDef.uuid })(updateResult.record)\n const applicable = Nodes.isChildApplicable(parentNode, entityDef.uuid)\n\n const deleteExistingEntities = () => {\n const existingEntityUuids = existingEntities.map((node) => node.uuid)\n const nodesDeleteUpdatedResult = deleteNodes(existingEntityUuids, recordUpdateOptions)(updateResult.record)\n updateResult.merge(nodesDeleteUpdatedResult)\n }\n\n if (!applicable) {\n if (existingEntities.length > 0) {\n deleteExistingEntities()\n }\n return\n }\n\n const enumeratorDef = Surveys.getNodeDefEnumerator({ survey, entityDef })\n if (!enumeratorDef) return\n\n const allowedCodes = await getEnumeratingItemsAllowedCodes({\n survey,\n user,\n record: updateResult.record,\n entityDef,\n parentNode,\n })\n\n const categoryItems = await getEnumeratingCategoryItems({\n survey,\n enumeratorDef,\n parentNode,\n categoryItemProvider,\n allowedCodes,\n })(updateResult.record)\n\n const targetItemUuids = new Set(categoryItems.map((item) => item.uuid))\n const existingItemUuids = new Set<string>()\n\n for (const existingEntity of existingEntities) {\n const existingEnumerator = getChild({ parentNode: existingEntity, childDefUuid: enumeratorDef.uuid })(\n updateResult.record\n )\n const itemUuid = existingEnumerator ? NodeValues.getItemUuid(existingEnumerator) : undefined\n if (!itemUuid || !targetItemUuids.has(itemUuid)) {\n const nodesDeleteUpdatedResult = deleteNodes([existingEntity.uuid], recordUpdateOptions)(updateResult.record)\n updateResult.merge(nodesDeleteUpdatedResult)\n } else {\n existingItemUuids.add(itemUuid)\n }\n }\n\n for (const categoryItem of categoryItems) {\n if (!existingItemUuids.has(categoryItem.uuid)) {\n const createParams = {\n user,\n survey,\n parentNode,\n nodeDef: entityDef,\n enumeratorDef,\n categoryItem,\n updateResult,\n sideEffect,\n }\n // create entities sequentially: every iteration updates the record\n await createEnumeratedEntityNode(createParams) // NOSONAR\n }\n }\n}\n\nexport const updateDependentEnumeratingItemsEntities = async (\n params: RecordNodeDependentsUpdateParams\n): Promise<RecordUpdateResult> => {\n const { survey, record, node } = params\n\n const updateResult = new RecordUpdateResult({ record })\n\n const nodePointers = getEnumeratingItemsNodePointers({ survey, record, node })\n\n for (const nodePointer of nodePointers) {\n const { nodeCtx: parentNode, nodeDef } = nodePointer\n if (!NodeDefs.isEntity(nodeDef)) continue\n\n const entityDef = nodeDef as NodeDefEntity\n if (!NodeDefs.isEnumerate(entityDef)) continue\n if (!NodeDefs.getEnumeratingItemsExpression(entityDef)) continue\n\n // sequential: each iteration updates the record\n await syncEnumeratingItemsEntities({ ...params, parentNode, entityDef, updateResult }) // NOSONAR\n }\n\n return updateResult\n}\n"]}
@@ -21,7 +21,7 @@ export declare const Records: {
21
21
  getChild: import("./_records/recordGetters").PositionalRecordGetter<{
22
22
  parentNode: import("..").ArenaRecordNode;
23
23
  childDefUuid: string;
24
- }, [parentNode: import("..").ArenaRecordNode, childDefUuid: string], import("..").ArenaRecordNode>;
24
+ }, [parentNode: import("..").ArenaRecordNode, childDefUuid: string], import("..").ArenaRecordNode | undefined>;
25
25
  getChildren: import("./_records/recordGetters").PositionalRecordGetter<{
26
26
  parentNode: import("..").ArenaRecordNode;
27
27
  childDefUuid?: string;
@@ -107,7 +107,7 @@ export declare const Records: {
107
107
  record: import("./record").ArenaRecord;
108
108
  node: import("..").ArenaRecordNode;
109
109
  nodeDefDescendant: import("..").NodeDef<any>;
110
- }, import("..").ArenaRecordNode>;
110
+ }, import("..").ArenaRecordNode | undefined>;
111
111
  getDescendantsOrSelf: import("./_records/recordGetters").RecordGetter<{
112
112
  record: import("./record").ArenaRecord;
113
113
  node: import("..").ArenaRecordNode;
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "name": "OpenForis",
5
5
  "email": "openforis.arena@gmail.com"
6
6
  },
7
- "version": "2.5.6",
7
+ "version": "2.5.7",
8
8
  "description": "Arena core module",
9
9
  "repository": {
10
10
  "type": "git",