@openforis/arena-core 2.3.41 → 2.4.0

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.
Files changed (176) hide show
  1. package/dist/esm/index.js.map +1 -1
  2. package/dist/esm/node/nodes.js +12 -4
  3. package/dist/esm/node/nodes.js.map +1 -1
  4. package/dist/esm/record/_records/recordCompletion.js +3 -3
  5. package/dist/esm/record/_records/recordCompletion.js.map +1 -1
  6. package/dist/esm/record/_records/recordGetters.js +221 -143
  7. package/dist/esm/record/_records/recordGetters.js.map +1 -1
  8. package/dist/esm/record/_records/recordNodesIndexUpdater.js +6 -4
  9. package/dist/esm/record/_records/recordNodesIndexUpdater.js.map +1 -1
  10. package/dist/esm/record/_records/recordPagesValidation.js +5 -5
  11. package/dist/esm/record/_records/recordPagesValidation.js.map +1 -1
  12. package/dist/esm/record/_records/recordUpdateOptions.js.map +1 -1
  13. package/dist/esm/record/_records/recordUpdater.js +1 -1
  14. package/dist/esm/record/_records/recordUpdater.js.map +1 -1
  15. package/dist/esm/record/_records/recordUtils.js +3 -7
  16. package/dist/esm/record/_records/recordUtils.js.map +1 -1
  17. package/dist/esm/record/nodePointers.js +1 -1
  18. package/dist/esm/record/nodePointers.js.map +1 -1
  19. package/dist/esm/record/recordCloner.js +1 -1
  20. package/dist/esm/record/recordCloner.js.map +1 -1
  21. package/dist/esm/record/recordExpressionEvaluator/functions.js +4 -5
  22. package/dist/esm/record/recordExpressionEvaluator/functions.js.map +1 -1
  23. package/dist/esm/record/recordExpressionEvaluator/node/identifier/identifier.js +1 -1
  24. package/dist/esm/record/recordExpressionEvaluator/node/identifier/identifier.js.map +1 -1
  25. package/dist/esm/record/recordExpressionEvaluator/node/identifier/nodesFinder.js +2 -2
  26. package/dist/esm/record/recordExpressionEvaluator/node/identifier/nodesFinder.js.map +1 -1
  27. package/dist/esm/record/recordExpressionEvaluator/recordExpressionEvaluator.js +1 -1
  28. package/dist/esm/record/recordExpressionEvaluator/recordExpressionEvaluator.js.map +1 -1
  29. package/dist/esm/record/recordFixer.js +5 -5
  30. package/dist/esm/record/recordFixer.js.map +1 -1
  31. package/dist/esm/record/recordNodesUpdater/recordExpressionValueConverter.js +2 -8
  32. package/dist/esm/record/recordNodesUpdater/recordExpressionValueConverter.js.map +1 -1
  33. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsApplicableUpdater.js +7 -7
  34. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsApplicableUpdater.js.map +1 -1
  35. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsBooleanUpdater.js +1 -1
  36. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsBooleanUpdater.js.map +1 -1
  37. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsCodeAttributesUpdater.js +1 -1
  38. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsCodeAttributesUpdater.js.map +1 -1
  39. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsCountUpdater.js +1 -6
  40. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsCountUpdater.js.map +1 -1
  41. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsDefaultValuesUpdater.js +3 -4
  42. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsDefaultValuesUpdater.js.map +1 -1
  43. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEditableUpdater.js +1 -1
  44. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEditableUpdater.js.map +1 -1
  45. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.js +3 -3
  46. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.js.map +1 -1
  47. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.js +4 -9
  48. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.js.map +1 -1
  49. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsFileNamesEvaluator.js +2 -3
  50. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsFileNamesEvaluator.js.map +1 -1
  51. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsVisibleUpdater.js +1 -1
  52. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsVisibleUpdater.js.map +1 -1
  53. package/dist/esm/record/recordNodesUpdater/recordNodesDeleter.js +2 -6
  54. package/dist/esm/record/recordNodesUpdater/recordNodesDeleter.js.map +1 -1
  55. package/dist/esm/record/recordNodesUpdater/recordNodesDependentsUpdaterCommons.js +2 -9
  56. package/dist/esm/record/recordNodesUpdater/recordNodesDependentsUpdaterCommons.js.map +1 -1
  57. package/dist/esm/record/recordNodesUpdater/recordNodesUpdater.js +1 -1
  58. package/dist/esm/record/recordNodesUpdater/recordNodesUpdater.js.map +1 -1
  59. package/dist/esm/record/recordPrettyPrinter.js +14 -12
  60. package/dist/esm/record/recordPrettyPrinter.js.map +1 -1
  61. package/dist/esm/record/recordUpdater.js +2 -2
  62. package/dist/esm/record/recordUpdater.js.map +1 -1
  63. package/dist/esm/record/recordValidator/attributeKeyValidator.js +4 -4
  64. package/dist/esm/record/recordValidator/attributeKeyValidator.js.map +1 -1
  65. package/dist/esm/record/recordValidator/attributeUniqueValidator.js +1 -1
  66. package/dist/esm/record/recordValidator/attributeUniqueValidator.js.map +1 -1
  67. package/dist/esm/record/recordValidator/attributeValidator.js +8 -10
  68. package/dist/esm/record/recordValidator/attributeValidator.js.map +1 -1
  69. package/dist/esm/record/recordValidator/countVaildator.js +2 -2
  70. package/dist/esm/record/recordValidator/countVaildator.js.map +1 -1
  71. package/dist/esm/record/recordValidator/recordValidator.js +1 -2
  72. package/dist/esm/record/recordValidator/recordValidator.js.map +1 -1
  73. package/dist/esm/survey/nodeDefsFixer.js.map +1 -1
  74. package/dist/esm/survey/surveys/_nodeDefs/nodeDefsIndex.js +2 -2
  75. package/dist/esm/survey/surveys/_nodeDefs/nodeDefsIndex.js.map +1 -1
  76. package/dist/esm/utils/index.js.map +1 -1
  77. package/dist/esm/utils/mutationOptions.js +5 -0
  78. package/dist/esm/utils/mutationOptions.js.map +1 -0
  79. package/dist/esm/validation/index.js.map +1 -1
  80. package/dist/esm/validation/validations.js +26 -19
  81. package/dist/esm/validation/validations.js.map +1 -1
  82. package/dist/index.d.ts +2 -2
  83. package/dist/index.js.map +1 -1
  84. package/dist/node/nodes.d.ts +10 -3
  85. package/dist/node/nodes.js +12 -4
  86. package/dist/node/nodes.js.map +1 -1
  87. package/dist/record/_records/recordCompletion.js +3 -3
  88. package/dist/record/_records/recordCompletion.js.map +1 -1
  89. package/dist/record/_records/recordGetters.d.ts +104 -51
  90. package/dist/record/_records/recordGetters.js +221 -170
  91. package/dist/record/_records/recordGetters.js.map +1 -1
  92. package/dist/record/_records/recordNodesIndexUpdater.d.ts +6 -3
  93. package/dist/record/_records/recordNodesIndexUpdater.js +6 -4
  94. package/dist/record/_records/recordNodesIndexUpdater.js.map +1 -1
  95. package/dist/record/_records/recordPagesValidation.js +5 -5
  96. package/dist/record/_records/recordPagesValidation.js.map +1 -1
  97. package/dist/record/_records/recordUpdateOptions.d.ts +2 -2
  98. package/dist/record/_records/recordUpdateOptions.js.map +1 -1
  99. package/dist/record/_records/recordUpdater.js +1 -1
  100. package/dist/record/_records/recordUpdater.js.map +1 -1
  101. package/dist/record/_records/recordUtils.js +3 -7
  102. package/dist/record/_records/recordUtils.js.map +1 -1
  103. package/dist/record/nodePointers.js +1 -1
  104. package/dist/record/nodePointers.js.map +1 -1
  105. package/dist/record/recordCloner.js +1 -1
  106. package/dist/record/recordCloner.js.map +1 -1
  107. package/dist/record/recordExpressionEvaluator/functions.js +4 -5
  108. package/dist/record/recordExpressionEvaluator/functions.js.map +1 -1
  109. package/dist/record/recordExpressionEvaluator/node/identifier/identifier.js +1 -1
  110. package/dist/record/recordExpressionEvaluator/node/identifier/identifier.js.map +1 -1
  111. package/dist/record/recordExpressionEvaluator/node/identifier/nodesFinder.js +2 -2
  112. package/dist/record/recordExpressionEvaluator/node/identifier/nodesFinder.js.map +1 -1
  113. package/dist/record/recordExpressionEvaluator/recordExpressionEvaluator.js +1 -1
  114. package/dist/record/recordExpressionEvaluator/recordExpressionEvaluator.js.map +1 -1
  115. package/dist/record/recordFixer.js +5 -5
  116. package/dist/record/recordFixer.js.map +1 -1
  117. package/dist/record/recordNodesUpdater/recordExpressionValueConverter.js +2 -8
  118. package/dist/record/recordNodesUpdater/recordExpressionValueConverter.js.map +1 -1
  119. package/dist/record/recordNodesUpdater/recordNodeDependentsApplicableUpdater.js +7 -7
  120. package/dist/record/recordNodesUpdater/recordNodeDependentsApplicableUpdater.js.map +1 -1
  121. package/dist/record/recordNodesUpdater/recordNodeDependentsBooleanUpdater.d.ts +2 -1
  122. package/dist/record/recordNodesUpdater/recordNodeDependentsBooleanUpdater.js +1 -1
  123. package/dist/record/recordNodesUpdater/recordNodeDependentsBooleanUpdater.js.map +1 -1
  124. package/dist/record/recordNodesUpdater/recordNodeDependentsCodeAttributesUpdater.js +1 -1
  125. package/dist/record/recordNodesUpdater/recordNodeDependentsCodeAttributesUpdater.js.map +1 -1
  126. package/dist/record/recordNodesUpdater/recordNodeDependentsCountUpdater.js +1 -6
  127. package/dist/record/recordNodesUpdater/recordNodeDependentsCountUpdater.js.map +1 -1
  128. package/dist/record/recordNodesUpdater/recordNodeDependentsDefaultValuesUpdater.js +3 -4
  129. package/dist/record/recordNodesUpdater/recordNodeDependentsDefaultValuesUpdater.js.map +1 -1
  130. package/dist/record/recordNodesUpdater/recordNodeDependentsEditableUpdater.js +1 -1
  131. package/dist/record/recordNodesUpdater/recordNodeDependentsEditableUpdater.js.map +1 -1
  132. package/dist/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.js +3 -3
  133. package/dist/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.js.map +1 -1
  134. package/dist/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.js +4 -9
  135. package/dist/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.js.map +1 -1
  136. package/dist/record/recordNodesUpdater/recordNodeDependentsFileNamesEvaluator.js +2 -3
  137. package/dist/record/recordNodesUpdater/recordNodeDependentsFileNamesEvaluator.js.map +1 -1
  138. package/dist/record/recordNodesUpdater/recordNodeDependentsVisibleUpdater.js +1 -1
  139. package/dist/record/recordNodesUpdater/recordNodeDependentsVisibleUpdater.js.map +1 -1
  140. package/dist/record/recordNodesUpdater/recordNodesDeleter.js +2 -6
  141. package/dist/record/recordNodesUpdater/recordNodesDeleter.js.map +1 -1
  142. package/dist/record/recordNodesUpdater/recordNodesDependentsUpdaterCommons.js +2 -9
  143. package/dist/record/recordNodesUpdater/recordNodesDependentsUpdaterCommons.js.map +1 -1
  144. package/dist/record/recordNodesUpdater/recordNodesUpdater.js +1 -1
  145. package/dist/record/recordNodesUpdater/recordNodesUpdater.js.map +1 -1
  146. package/dist/record/recordPrettyPrinter.js +14 -12
  147. package/dist/record/recordPrettyPrinter.js.map +1 -1
  148. package/dist/record/recordUpdater.js +2 -2
  149. package/dist/record/recordUpdater.js.map +1 -1
  150. package/dist/record/recordValidator/attributeKeyValidator.js +4 -4
  151. package/dist/record/recordValidator/attributeKeyValidator.js.map +1 -1
  152. package/dist/record/recordValidator/attributeUniqueValidator.js +1 -1
  153. package/dist/record/recordValidator/attributeUniqueValidator.js.map +1 -1
  154. package/dist/record/recordValidator/attributeValidator.js +8 -10
  155. package/dist/record/recordValidator/attributeValidator.js.map +1 -1
  156. package/dist/record/recordValidator/countVaildator.js +2 -2
  157. package/dist/record/recordValidator/countVaildator.js.map +1 -1
  158. package/dist/record/recordValidator/recordValidator.js +1 -2
  159. package/dist/record/recordValidator/recordValidator.js.map +1 -1
  160. package/dist/record/records.d.ts +340 -40
  161. package/dist/survey/nodeDefsFixer.d.ts +2 -2
  162. package/dist/survey/nodeDefsFixer.js.map +1 -1
  163. package/dist/survey/surveys/_nodeDefs/nodeDefsIndex.d.ts +3 -6
  164. package/dist/survey/surveys/_nodeDefs/nodeDefsIndex.js +2 -2
  165. package/dist/survey/surveys/_nodeDefs/nodeDefsIndex.js.map +1 -1
  166. package/dist/utils/index.d.ts +1 -0
  167. package/dist/utils/index.js.map +1 -1
  168. package/dist/utils/mutationOptions.d.ts +14 -0
  169. package/dist/utils/mutationOptions.js +9 -0
  170. package/dist/utils/mutationOptions.js.map +1 -0
  171. package/dist/validation/index.d.ts +1 -0
  172. package/dist/validation/index.js.map +1 -1
  173. package/dist/validation/validations.d.ts +17 -2
  174. package/dist/validation/validations.js +26 -19
  175. package/dist/validation/validations.js.map +1 -1
  176. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"attributeValidator.js","sourceRoot":"","sources":["../../../src/record/recordValidator/attributeValidator.ts"],"names":[],"mappings":"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","sourcesContent":["import { User } from '../../auth'\nimport { Dictionary } from '../../common'\nimport { Labels } from '../../language'\nimport { ArenaRecordNode, NodeKeys, Nodes, NodeValues } from '../../node'\nimport { NodeDef, NodeDefExpression, NodeDefProps, NodeDefs, NodeDefType } from '../../nodeDef'\nimport { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider'\nimport { TaxonProvider } from '../../nodeDefExpressionEvaluator/taxonProvider'\nimport { Survey, Surveys } from '../../survey'\nimport { SurveyDependencyType } from '../../survey/survey'\nimport { Objects } from '../../utils'\nimport {\n ValidationFactory,\n ValidationResult,\n ValidationResultFactory,\n ValidationSeverity,\n Validator,\n} from '../../validation'\nimport { ValidationFields } from '../../validation/validation'\nimport { NodePointers } from '../nodePointers'\nimport { ArenaRecord } from '../record'\nimport { RecordExpressionEvaluator } from '../recordExpressionEvaluator'\nimport { Records } from '../records'\nimport { RecordValidations } from '../recordValidations'\nimport { AttributeKeyValidator, createEntityKeysCache, EntityKeysCache } from './attributeKeyValidator'\nimport { AttributeTypeValidator } from './attributeTypeValidator'\nimport { AttributeUniqueValidator } from './attributeUniqueValidator'\n\nconst expressionEvaluator = new RecordExpressionEvaluator()\n\nexport interface RecordValidatorParams {\n user: User\n survey: Survey\n categoryItemProvider?: CategoryItemProvider\n taxonProvider?: TaxonProvider\n record: ArenaRecord\n}\n\nexport interface AttributeValidatorParams extends RecordValidatorParams {\n attribute: ArenaRecordNode\n}\n\nexport interface AttributesValidatorParams extends RecordValidatorParams {\n nodes: Dictionary<ArenaRecordNode>\n}\n\nexport interface SortedAttributesValidatorParams extends RecordValidatorParams {\n nodesArray: ArenaRecordNode[]\n}\n\ntype SiblingKeyNodeItem = { entityUuid: string; keyNode: ArenaRecordNode; hasErrors: boolean }\n\n// sibling key nodes are cached by ancestor multiple entity parent and def uuid during the same validation call:\n// when many entities are added to the same parent entity (e.g. data import), computing them for every updated\n// key attribute would take a time that grows quadratically with the number of entities\ntype SiblingKeyNodesCache = Map<string, SiblingKeyNodeItem[]>\n\nconst _getSiblingNodeKeys = (\n params: AttributeValidatorParams & { siblingKeyNodesCache?: SiblingKeyNodesCache }\n): SiblingKeyNodeItem[] => {\n const { survey, record, attribute, siblingKeyNodesCache } = params\n\n const attributeDef = Surveys.getNodeDefByUuid({ survey, uuid: attribute.nodeDefUuid })\n const ancestorMultipleEntityDef = Surveys.getNodeDefAncestorMultipleEntity({ survey, nodeDef: attributeDef })\n if (!ancestorMultipleEntityDef) {\n return []\n }\n const ancestorMultipleEntity = Records.getAncestor({\n record,\n node: attribute,\n ancestorDefUuid: ancestorMultipleEntityDef.uuid,\n })\n if (!ancestorMultipleEntity) return []\n\n const ancestorMultipleEntityParent = Records.getParent(ancestorMultipleEntity)(record)\n if (!ancestorMultipleEntityParent) return []\n\n const cacheKey = `${ancestorMultipleEntityParent.uuid}_${ancestorMultipleEntityDef.uuid}`\n let items = siblingKeyNodesCache?.get(cacheKey)\n if (!items) {\n const keyDefs = Surveys.getNodeDefKeys({ survey, nodeDef: ancestorMultipleEntityDef })\n const entities = Records.getEntitySiblings({ record, entity: ancestorMultipleEntity, includeSelf: true })\n items = []\n for (const entity of entities) {\n const keyNodes = Records.getEntityKeyNodes({ survey, record, entity, keyDefs })\n for (const keyNode of keyNodes) {\n if (!keyNode) continue\n const nodeValidation =\n record.validation && RecordValidations.getValidationNode({ nodeUuid: keyNode.uuid })(record.validation)\n items.push({ entityUuid: entity.uuid, keyNode, hasErrors: !!nodeValidation && !nodeValidation.valid })\n }\n }\n siblingKeyNodesCache?.set(cacheKey, items)\n }\n return items.filter((item) => item.entityUuid !== ancestorMultipleEntity.uuid)\n}\n\nconst _getValidationMessagesWithDefault = (params: {\n survey: Survey\n expression: NodeDefExpression\n defaultMessage?: string\n}): Labels => {\n const { survey, expression, defaultMessage } = params\n const messages: Labels = { ...expression.messages }\n\n const languages = Surveys.getLanguages(survey)\n const defaultMessageDefined = Objects.isNotEmpty(defaultMessage)\n\n for (const lang of languages) {\n const customMessage = messages[lang]\n if (Objects.isEmpty(customMessage) && defaultMessageDefined) {\n messages[lang] = defaultMessage\n }\n }\n\n return messages\n}\n\nconst _validateRequired =\n (params: { nodeDef: NodeDef<NodeDefType, NodeDefProps> }) =>\n (_field: string, node: any): Promise<ValidationResult> => {\n const { nodeDef } = params\n const valid = (!NodeDefs.isKey(nodeDef) && !NodeDefs.isRequired(nodeDef)) || !Nodes.isValueBlank(node)\n return Promise.resolve(\n valid\n ? ValidationResultFactory.createInstance()\n : ValidationResultFactory.createInstance({\n key: 'record.attribute.valueRequired',\n severity: ValidationSeverity.error,\n valid,\n })\n )\n }\n\n/**\n * Evaluates the validation expressions.\n */\nconst _validateNodeValidations =\n (params: { user: User; survey: Survey; record: ArenaRecord; nodeDef: NodeDef<NodeDefType, NodeDefProps> }) =>\n async (_propName: string, node: ArenaRecordNode): Promise<ValidationResult> => {\n const { user, survey, record, nodeDef } = params\n if (Nodes.isValueBlank(node)) return ValidationResultFactory.createInstance()\n\n const validations = NodeDefs.getValidations(nodeDef)\n if (!validations?.expressions?.length) return ValidationResultFactory.createInstance()\n\n const applicableExpressionsEval = await expressionEvaluator.evalApplicableExpressions({\n user,\n survey,\n record,\n nodeCtx: node,\n expressions: validations.expressions,\n stopAtFirstFound: false,\n })\n\n let validationResult = ValidationResultFactory.createInstance()\n\n for (const { expression, value: valid } of applicableExpressionsEval) {\n if (!valid) {\n const messages = _getValidationMessagesWithDefault({\n survey,\n expression,\n defaultMessage: expression.expression,\n })\n\n validationResult = ValidationResultFactory.createInstance({\n valid: false,\n key: 'record.attribute.customValidation',\n severity: expression.severity,\n messages,\n })\n break\n }\n }\n\n return validationResult\n }\n\nconst validateAttribute = async (params: AttributeValidatorParams & { entityKeysCache?: EntityKeysCache }) => {\n const { survey, record, attribute } = params\n if (Records.isNodeApplicable({ record, node: attribute })) {\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: attribute.nodeDefUuid })\n const validatorParams = { ...params, nodeDef }\n return new Validator().validate(attribute, {\n [NodeKeys.value]: [\n _validateRequired({ nodeDef }),\n AttributeTypeValidator.validateValueType(validatorParams),\n _validateNodeValidations(validatorParams),\n AttributeKeyValidator.validateAttributeKey(validatorParams),\n AttributeUniqueValidator.validateAttributeUnique(validatorParams),\n ],\n })\n }\n return ValidationFactory.createInstance()\n}\n\nconst findSiblingKeyNodesToValidate = (\n params: AttributeValidatorParams & {\n nodeDef: NodeDef<NodeDefType, NodeDefProps>\n nodeParent?: ArenaRecordNode\n siblingKeyNodesCache?: SiblingKeyNodesCache\n }\n) => {\n const { survey, nodeDef, nodeParent: parentNode, attribute } = params\n if (\n !NodeDefs.isKey(nodeDef) ||\n !parentNode ||\n (NodeDefs.isAutoIncrementalKey(nodeDef) && attribute.created && Nodes.isDefaultValueApplied(attribute))\n ) {\n // when a new node is created and the key is autoincremental, its value will be unique\n // and the validation of sibling key attributes is not necessary\n return []\n }\n // when a key attribute is updated, a sibling key attribute with the same value\n // or a sibling attribute with a validation error (duplicate key) should be re-validated\n const siblingNodeKeys = _getSiblingNodeKeys(params)\n const siblingNodeKeysWithSameValue: ArenaRecordNode[] = []\n const siblingNodeKeysWithErrors: ArenaRecordNode[] = []\n siblingNodeKeys.forEach(({ keyNode, hasErrors }) => {\n if (NodeValues.isValueEqual({ survey, nodeDef, parentNode, value: keyNode.value, valueSearch: attribute.value })) {\n siblingNodeKeysWithSameValue.push(keyNode)\n }\n if (hasErrors) {\n siblingNodeKeysWithErrors.push(keyNode)\n }\n })\n return [...siblingNodeKeysWithSameValue, ...siblingNodeKeysWithErrors]\n}\n\nconst findSortedNodesToValidate = (params: SortedAttributesValidatorParams): ArenaRecordNode[] => {\n const { survey, record, nodesArray } = params\n\n const result = []\n const siblingKeyNodesCache: SiblingKeyNodesCache = new Map()\n for (const node of nodesArray) {\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: node.nodeDefUuid })\n if (!NodeDefs.isAttribute(nodeDef)) {\n continue\n }\n // Get dependents and attribute itself\n const nodePointersAttributeAndDependents = Records.getDependentNodePointers({\n survey,\n record,\n node,\n dependencyType: SurveyDependencyType.validations,\n includeSelf: true,\n })\n\n const nodeParent = Records.getParent(node)(record)\n\n result.push(\n ...NodePointers.getNodesFromNodePointers({ record, nodePointers: nodePointersAttributeAndDependents }),\n ...findSiblingKeyNodesToValidate({ ...params, nodeDef, nodeParent, attribute: node, siblingKeyNodesCache })\n )\n\n if (NodeDefs.getValidations(nodeDef)?.unique) {\n result.push(...Records.getAttributeSiblings({ record, node, nodeDef }))\n }\n }\n\n return result\n}\n\nconst validateSelfAndDependentSortedAttributes = async (\n params: SortedAttributesValidatorParams\n): Promise<ValidationFields> => {\n const nodesToValidate: ArenaRecordNode[] = findSortedNodesToValidate(params)\n const validationsByNodeUuid: ValidationFields = {}\n // the record doesn't change during the validation: entity keys can be cached\n const entityKeysCache = createEntityKeysCache()\n\n for (const nodeToValidate of nodesToValidate) {\n const nodeUuid = nodeToValidate.uuid\n // Validate only attributes not deleted and not validated already\n if (!nodeToValidate.deleted && !validationsByNodeUuid[nodeUuid]) {\n // sequential: avoid concurrent item/taxon lookups on large node sets\n const attributeValidatorParams = { ...params, attribute: nodeToValidate, entityKeysCache }\n validationsByNodeUuid[nodeUuid] = await validateAttribute(attributeValidatorParams) // NOSONAR\n }\n }\n return validationsByNodeUuid\n}\n\nexport const AttributeValidator = {\n validateSelfAndDependentSortedAttributes,\n}\n"]}
1
+ {"version":3,"file":"attributeValidator.js","sourceRoot":"","sources":["../../../src/record/recordValidator/attributeValidator.ts"],"names":[],"mappings":"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","sourcesContent":["import { User } from '../../auth'\nimport { Dictionary } from '../../common'\nimport { Labels } from '../../language'\nimport { ArenaRecordNode, NodeKeys, Nodes, NodeValues } from '../../node'\nimport { NodeDef, NodeDefExpression, NodeDefProps, NodeDefs, NodeDefType } from '../../nodeDef'\nimport { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider'\nimport { TaxonProvider } from '../../nodeDefExpressionEvaluator/taxonProvider'\nimport { Survey, Surveys } from '../../survey'\nimport { SurveyDependencyType } from '../../survey/survey'\nimport { Objects } from '../../utils'\nimport {\n ValidationFactory,\n ValidationResult,\n ValidationResultFactory,\n ValidationSeverity,\n Validator,\n} from '../../validation'\nimport { ValidationFields } from '../../validation/validation'\nimport { NodePointers } from '../nodePointers'\nimport { ArenaRecord } from '../record'\nimport { RecordExpressionEvaluator } from '../recordExpressionEvaluator'\nimport { Records } from '../records'\nimport { RecordValidations } from '../recordValidations'\nimport { AttributeKeyValidator, createEntityKeysCache, EntityKeysCache } from './attributeKeyValidator'\nimport { AttributeTypeValidator } from './attributeTypeValidator'\nimport { AttributeUniqueValidator } from './attributeUniqueValidator'\n\nconst expressionEvaluator = new RecordExpressionEvaluator()\n\nexport interface RecordValidatorParams {\n user: User\n survey: Survey\n categoryItemProvider?: CategoryItemProvider\n taxonProvider?: TaxonProvider\n record: ArenaRecord\n}\n\nexport interface AttributeValidatorParams extends RecordValidatorParams {\n attribute: ArenaRecordNode\n}\n\nexport interface AttributesValidatorParams extends RecordValidatorParams {\n nodes: Dictionary<ArenaRecordNode>\n}\n\nexport interface SortedAttributesValidatorParams extends RecordValidatorParams {\n nodesArray: ArenaRecordNode[]\n}\n\ntype SiblingKeyNodeItem = { entityUuid: string; keyNode: ArenaRecordNode; hasErrors: boolean }\n\n// sibling key nodes are cached by ancestor multiple entity parent and def uuid during the same validation call:\n// when many entities are added to the same parent entity (e.g. data import), computing them for every updated\n// key attribute would take a time that grows quadratically with the number of entities\ntype SiblingKeyNodesCache = Map<string, SiblingKeyNodeItem[]>\n\nconst _getSiblingNodeKeys = (\n params: AttributeValidatorParams & { siblingKeyNodesCache?: SiblingKeyNodesCache }\n): SiblingKeyNodeItem[] => {\n const { survey, record, attribute, siblingKeyNodesCache } = params\n\n const attributeDef = Surveys.getNodeDefByUuid({ survey, uuid: attribute.nodeDefUuid })\n const ancestorMultipleEntityDef = Surveys.getNodeDefAncestorMultipleEntity({ survey, nodeDef: attributeDef })\n if (!ancestorMultipleEntityDef) {\n return []\n }\n const ancestorMultipleEntity = Records.getAncestor({\n node: attribute,\n ancestorDefUuid: ancestorMultipleEntityDef.uuid,\n })(record)\n if (!ancestorMultipleEntity) return []\n\n const ancestorMultipleEntityParent = Records.getParent({ node: ancestorMultipleEntity })(record)\n if (!ancestorMultipleEntityParent) return []\n\n const cacheKey = `${ancestorMultipleEntityParent.uuid}_${ancestorMultipleEntityDef.uuid}`\n let items = siblingKeyNodesCache?.get(cacheKey)\n if (!items) {\n const keyDefs = Surveys.getNodeDefKeys({ survey, nodeDef: ancestorMultipleEntityDef })\n const entities = Records.getEntitySiblings({ entity: ancestorMultipleEntity, includeSelf: true })(record)\n items = []\n for (const entity of entities) {\n const keyNodes = Records.getEntityKeyNodes({ survey, entity, keyDefs })(record)\n for (const keyNode of keyNodes) {\n if (!keyNode) continue\n const nodeValidation =\n record.validation && RecordValidations.getValidationNode({ nodeUuid: keyNode.uuid })(record.validation)\n items.push({ entityUuid: entity.uuid, keyNode, hasErrors: !!nodeValidation && !nodeValidation.valid })\n }\n }\n siblingKeyNodesCache?.set(cacheKey, items)\n }\n return items.filter((item) => item.entityUuid !== ancestorMultipleEntity.uuid)\n}\n\nconst _getValidationMessagesWithDefault = (params: {\n survey: Survey\n expression: NodeDefExpression\n defaultMessage?: string\n}): Labels => {\n const { survey, expression, defaultMessage } = params\n const messages: Labels = { ...expression.messages }\n\n const languages = Surveys.getLanguages(survey)\n const defaultMessageDefined = Objects.isNotEmpty(defaultMessage)\n\n for (const lang of languages) {\n const customMessage = messages[lang]\n if (Objects.isEmpty(customMessage) && defaultMessageDefined) {\n messages[lang] = defaultMessage\n }\n }\n\n return messages\n}\n\nconst _validateRequired =\n (params: { nodeDef: NodeDef<NodeDefType, NodeDefProps> }) =>\n (_field: string, node: any): Promise<ValidationResult> => {\n const { nodeDef } = params\n const valid = (!NodeDefs.isKey(nodeDef) && !NodeDefs.isRequired(nodeDef)) || !Nodes.isValueBlank(node)\n return Promise.resolve(\n valid\n ? ValidationResultFactory.createInstance()\n : ValidationResultFactory.createInstance({\n key: 'record.attribute.valueRequired',\n severity: ValidationSeverity.error,\n valid,\n })\n )\n }\n\n/**\n * Evaluates the validation expressions.\n */\nconst _validateNodeValidations =\n (params: { user: User; survey: Survey; record: ArenaRecord; nodeDef: NodeDef<NodeDefType, NodeDefProps> }) =>\n async (_propName: string, node: ArenaRecordNode): Promise<ValidationResult> => {\n const { user, survey, record, nodeDef } = params\n if (Nodes.isValueBlank(node)) return ValidationResultFactory.createInstance()\n\n const validations = NodeDefs.getValidations(nodeDef)\n if (!validations?.expressions?.length) return ValidationResultFactory.createInstance()\n\n const applicableExpressionsEval = await expressionEvaluator.evalApplicableExpressions({\n user,\n survey,\n record,\n nodeCtx: node,\n expressions: validations.expressions,\n stopAtFirstFound: false,\n })\n\n let validationResult = ValidationResultFactory.createInstance()\n\n for (const { expression, value: valid } of applicableExpressionsEval) {\n if (!valid) {\n const messages = _getValidationMessagesWithDefault({\n survey,\n expression,\n defaultMessage: expression.expression,\n })\n\n validationResult = ValidationResultFactory.createInstance({\n valid: false,\n key: 'record.attribute.customValidation',\n severity: expression.severity,\n messages,\n })\n break\n }\n }\n\n return validationResult\n }\n\nconst validateAttribute = async (params: AttributeValidatorParams & { entityKeysCache?: EntityKeysCache }) => {\n const { survey, record, attribute } = params\n if (Records.isNodeApplicable({ node: attribute })(record)) {\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: attribute.nodeDefUuid })\n const validatorParams = { ...params, nodeDef }\n return new Validator().validate(attribute, {\n [NodeKeys.value]: [\n _validateRequired({ nodeDef }),\n AttributeTypeValidator.validateValueType(validatorParams),\n _validateNodeValidations(validatorParams),\n AttributeKeyValidator.validateAttributeKey(validatorParams),\n AttributeUniqueValidator.validateAttributeUnique(validatorParams),\n ],\n })\n }\n return ValidationFactory.createInstance()\n}\n\nconst findSiblingKeyNodesToValidate = (\n params: AttributeValidatorParams & {\n nodeDef: NodeDef<NodeDefType, NodeDefProps>\n nodeParent?: ArenaRecordNode\n siblingKeyNodesCache?: SiblingKeyNodesCache\n }\n) => {\n const { survey, nodeDef, nodeParent: parentNode, attribute } = params\n if (\n !NodeDefs.isKey(nodeDef) ||\n !parentNode ||\n (NodeDefs.isAutoIncrementalKey(nodeDef) && attribute.created && Nodes.isDefaultValueApplied(attribute))\n ) {\n // when a new node is created and the key is autoincremental, its value will be unique\n // and the validation of sibling key attributes is not necessary\n return []\n }\n // when a key attribute is updated, a sibling key attribute with the same value\n // or a sibling attribute with a validation error (duplicate key) should be re-validated\n const siblingNodeKeys = _getSiblingNodeKeys(params)\n const siblingNodeKeysWithSameValue: ArenaRecordNode[] = []\n const siblingNodeKeysWithErrors: ArenaRecordNode[] = []\n siblingNodeKeys.forEach(({ keyNode, hasErrors }) => {\n if (NodeValues.isValueEqual({ survey, nodeDef, parentNode, value: keyNode.value, valueSearch: attribute.value })) {\n siblingNodeKeysWithSameValue.push(keyNode)\n }\n if (hasErrors) {\n siblingNodeKeysWithErrors.push(keyNode)\n }\n })\n return [...siblingNodeKeysWithSameValue, ...siblingNodeKeysWithErrors]\n}\n\nconst findSortedNodesToValidate = (params: SortedAttributesValidatorParams): ArenaRecordNode[] => {\n const { survey, record, nodesArray } = params\n\n const result = []\n const siblingKeyNodesCache: SiblingKeyNodesCache = new Map()\n for (const node of nodesArray) {\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: node.nodeDefUuid })\n if (!NodeDefs.isAttribute(nodeDef)) {\n continue\n }\n // Get dependents and attribute itself\n const nodePointersAttributeAndDependents = Records.getDependentNodePointers({\n survey,\n node,\n dependencyType: SurveyDependencyType.validations,\n includeSelf: true,\n })(record)\n\n const nodeParent = Records.getParent({ node })(record)\n\n result.push(\n ...NodePointers.getNodesFromNodePointers({ record, nodePointers: nodePointersAttributeAndDependents }),\n ...findSiblingKeyNodesToValidate({ ...params, nodeDef, nodeParent, attribute: node, siblingKeyNodesCache })\n )\n\n if (NodeDefs.getValidations(nodeDef)?.unique) {\n result.push(...Records.getAttributeSiblings({ node, nodeDef })(record))\n }\n }\n\n return result\n}\n\nconst validateSelfAndDependentSortedAttributes = async (\n params: SortedAttributesValidatorParams\n): Promise<ValidationFields> => {\n const nodesToValidate: ArenaRecordNode[] = findSortedNodesToValidate(params)\n const validationsByNodeUuid: ValidationFields = {}\n // the record doesn't change during the validation: entity keys can be cached\n const entityKeysCache = createEntityKeysCache()\n\n for (const nodeToValidate of nodesToValidate) {\n const nodeUuid = nodeToValidate.uuid\n // Validate only attributes not deleted and not validated already\n if (!nodeToValidate.deleted && !validationsByNodeUuid[nodeUuid]) {\n // sequential: avoid concurrent item/taxon lookups on large node sets\n const attributeValidatorParams = { ...params, attribute: nodeToValidate, entityKeysCache }\n validationsByNodeUuid[nodeUuid] = await validateAttribute(attributeValidatorParams) // NOSONAR\n }\n }\n return validationsByNodeUuid\n}\n\nexport const AttributeValidator = {\n validateSelfAndDependentSortedAttributes,\n}\n"]}
@@ -49,7 +49,7 @@ const validateChildrenCount = (params) => {
49
49
  };
50
50
  const _countChildren = (params) => {
51
51
  const { record, parentNode, childDef } = params;
52
- const children = records_1.Records.getChildren(parentNode, childDef.uuid)(record);
52
+ const children = records_1.Records.getChildren({ parentNode, childDefUuid: childDef.uuid })(record);
53
53
  const nonEmptyChildren = nodeDef_1.NodeDefs.isAttribute(childDef)
54
54
  ? children.filter((child) => !node_1.Nodes.isValueBlank(child))
55
55
  : children;
@@ -69,7 +69,7 @@ const getNodePointersToValidate = (params) => {
69
69
  const { survey, record, node } = params;
70
70
  const nodePointersToValidate = [];
71
71
  const nodeDef = survey_1.Surveys.getNodeDefByUuid({ uuid: node.nodeDefUuid, survey });
72
- const nodeParent = records_1.Records.getParent(node)(record);
72
+ const nodeParent = records_1.Records.getParent({ node })(record);
73
73
  if (nodeParent) {
74
74
  // always validate the node itself
75
75
  const nodePointer = { nodeCtx: nodeParent, nodeDef };
@@ -1 +1 @@
1
- {"version":3,"file":"countVaildator.js","sourceRoot":"","sources":["../../../src/record/recordValidator/countVaildator.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArenaRecordNode, NodePointer, Nodes } from '../../node'\nimport { NodeDef, NodeDefProps, NodeDefs, NodeDefType } from '../../nodeDef'\nimport { Records } from '../records'\nimport { Validation, ValidationFactory, ValidationResultFactory, ValidationSeverity } from '../../validation'\nimport { ArenaRecord } from '../record'\nimport { Survey, Surveys } from '../../survey'\nimport { RecordValidations } from '../recordValidations'\nimport { ValidationFields } from '../../validation/validation'\n\nconst createValidationResult = (params: {\n nodeDefUuid: string\n isMinCountValidation: boolean\n minCount: number\n maxCount: number\n}): Validation => {\n const { nodeDefUuid, isMinCountValidation, minCount, maxCount } = params\n\n if (minCount === maxCount) {\n return ValidationFactory.createInstance({\n valid: false,\n errors: [\n ValidationResultFactory.createInstance({\n key: 'record.nodes.count.invalid',\n params: { nodeDefUuid, count: minCount },\n severity: ValidationSeverity.error,\n }),\n ],\n })\n }\n return ValidationFactory.createInstance({\n valid: false,\n errors: [\n ValidationResultFactory.createInstance({\n key: isMinCountValidation ? 'record.nodes.count.minNotReached' : 'record.nodes.count.maxExceeded',\n params: { nodeDefUuid, ...(isMinCountValidation ? { minCount } : { maxCount }) },\n severity: ValidationSeverity.error,\n }),\n ],\n })\n}\n\nconst validateChildrenCount = (params: {\n parentNode: ArenaRecordNode\n nodeDefChild: NodeDef<NodeDefType, NodeDefProps>\n count: number\n}): Validation => {\n const { parentNode, nodeDefChild, count } = params\n\n const minCount = Nodes.getChildrenMinCount({ parentNode, nodeDef: nodeDefChild })\n const maxCount = Nodes.getChildrenMaxCount({ parentNode, nodeDef: nodeDefChild })\n\n const minCountValid = Number.isNaN(minCount) || count >= minCount\n const maxCountValid = Number.isNaN(maxCount) || count <= maxCount\n\n return minCountValid && maxCountValid\n ? ValidationFactory.createInstance()\n : createValidationResult({\n nodeDefUuid: nodeDefChild.uuid,\n isMinCountValidation: !minCountValid,\n minCount,\n maxCount,\n })\n}\n\nconst _countChildren = (params: {\n record: ArenaRecord\n parentNode: ArenaRecordNode\n childDef: NodeDef<NodeDefType, NodeDefProps>\n}) => {\n const { record, parentNode, childDef } = params\n const children = Records.getChildren(parentNode, childDef.uuid)(record)\n const nonEmptyChildren = NodeDefs.isAttribute(childDef)\n ? children.filter((child) => !Nodes.isValueBlank(child))\n : children\n return nonEmptyChildren.length\n}\n\nconst isNodePointerToBeValidated = (nodePointer: NodePointer) => NodeDefs.hasMinOrMaxCount(nodePointer.nodeDef)\n\nconst validateNodePointer = (params: {\n record: ArenaRecord\n nodeCtx: ArenaRecordNode\n nodeDef: NodeDef<NodeDefType, NodeDefProps>\n}) => {\n const { record, nodeCtx, nodeDef } = params\n // Check children count only for applicable nodes\n if (Nodes.isChildApplicable(nodeCtx, nodeDef.uuid)) {\n const count = _countChildren({ record, parentNode: nodeCtx, childDef: nodeDef })\n return validateChildrenCount({ parentNode: nodeCtx, nodeDefChild: nodeDef, count })\n }\n return ValidationFactory.createInstance()\n}\n\nconst getNodePointersToValidate = (params: {\n survey: Survey\n record: ArenaRecord\n node: ArenaRecordNode\n}): NodePointer[] => {\n const { survey, record, node } = params\n const nodePointersToValidate: NodePointer[] = []\n\n const nodeDef = Surveys.getNodeDefByUuid({ uuid: node.nodeDefUuid, survey })\n\n const nodeParent = Records.getParent(node)(record)\n if (nodeParent) {\n // always validate the node itself\n const nodePointer = { nodeCtx: nodeParent, nodeDef }\n if (isNodePointerToBeValidated(nodePointer)) {\n nodePointersToValidate.push(nodePointer)\n }\n }\n if (NodeDefs.isEntity(nodeDef) && !node.deleted) {\n // validate the count of every node def children\n const childDefs = Surveys.getNodeDefChildren({ survey, nodeDef })\n for (const childDef of childDefs) {\n const nodePointer = { nodeCtx: node, nodeDef: childDef }\n if (isNodePointerToBeValidated(nodePointer)) {\n nodePointersToValidate.push(nodePointer)\n }\n }\n }\n return nodePointersToValidate\n}\n\nconst validateChildrenCountNodesArray = (params: {\n survey: Survey\n record: ArenaRecord\n nodesArray: ArenaRecordNode[]\n}): ValidationFields => {\n const { survey, record, nodesArray } = params\n const validationsAcc: ValidationFields = {}\n for (const node of nodesArray) {\n const nodePointersToValidate = getNodePointersToValidate({ survey, record, node })\n\n for (const nodePointer of nodePointersToValidate) {\n const { nodeCtx, nodeDef } = nodePointer\n // check if validated already\n const validationChildrenCountKey = RecordValidations.getValidationChildrenCountKey({\n nodeParentUuid: nodeCtx.uuid,\n nodeDefChildUuid: nodeDef.uuid,\n })\n if (!(validationChildrenCountKey in validationsAcc)) {\n // validate the children count of this node pointer\n const validationNodePointer = validateNodePointer({ record, nodeCtx, nodeDef })\n validationsAcc[validationChildrenCountKey] = validationNodePointer\n }\n }\n }\n return validationsAcc\n}\n\nconst validateChildrenCountNodes = (params: {\n survey: Survey\n record: ArenaRecord\n nodes: { [key: string]: ArenaRecordNode }\n}): ValidationFields => validateChildrenCountNodesArray({ ...params, nodesArray: Object.values(params.nodes) })\n\nexport const CountValidator = {\n validateChildrenCount,\n validateChildrenCountNodesArray,\n validateChildrenCountNodes,\n}\n"]}
1
+ {"version":3,"file":"countVaildator.js","sourceRoot":"","sources":["../../../src/record/recordValidator/countVaildator.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArenaRecordNode, NodePointer, Nodes } from '../../node'\nimport { NodeDef, NodeDefProps, NodeDefs, NodeDefType } from '../../nodeDef'\nimport { Records } from '../records'\nimport { Validation, ValidationFactory, ValidationResultFactory, ValidationSeverity } from '../../validation'\nimport { ArenaRecord } from '../record'\nimport { Survey, Surveys } from '../../survey'\nimport { RecordValidations } from '../recordValidations'\nimport { ValidationFields } from '../../validation/validation'\n\nconst createValidationResult = (params: {\n nodeDefUuid: string\n isMinCountValidation: boolean\n minCount: number\n maxCount: number\n}): Validation => {\n const { nodeDefUuid, isMinCountValidation, minCount, maxCount } = params\n\n if (minCount === maxCount) {\n return ValidationFactory.createInstance({\n valid: false,\n errors: [\n ValidationResultFactory.createInstance({\n key: 'record.nodes.count.invalid',\n params: { nodeDefUuid, count: minCount },\n severity: ValidationSeverity.error,\n }),\n ],\n })\n }\n return ValidationFactory.createInstance({\n valid: false,\n errors: [\n ValidationResultFactory.createInstance({\n key: isMinCountValidation ? 'record.nodes.count.minNotReached' : 'record.nodes.count.maxExceeded',\n params: { nodeDefUuid, ...(isMinCountValidation ? { minCount } : { maxCount }) },\n severity: ValidationSeverity.error,\n }),\n ],\n })\n}\n\nconst validateChildrenCount = (params: {\n parentNode: ArenaRecordNode\n nodeDefChild: NodeDef<NodeDefType, NodeDefProps>\n count: number\n}): Validation => {\n const { parentNode, nodeDefChild, count } = params\n\n const minCount = Nodes.getChildrenMinCount({ parentNode, nodeDef: nodeDefChild })\n const maxCount = Nodes.getChildrenMaxCount({ parentNode, nodeDef: nodeDefChild })\n\n const minCountValid = Number.isNaN(minCount) || count >= minCount\n const maxCountValid = Number.isNaN(maxCount) || count <= maxCount\n\n return minCountValid && maxCountValid\n ? ValidationFactory.createInstance()\n : createValidationResult({\n nodeDefUuid: nodeDefChild.uuid,\n isMinCountValidation: !minCountValid,\n minCount,\n maxCount,\n })\n}\n\nconst _countChildren = (params: {\n record: ArenaRecord\n parentNode: ArenaRecordNode\n childDef: NodeDef<NodeDefType, NodeDefProps>\n}) => {\n const { record, parentNode, childDef } = params\n const children = Records.getChildren({ parentNode, childDefUuid: childDef.uuid })(record)\n const nonEmptyChildren = NodeDefs.isAttribute(childDef)\n ? children.filter((child) => !Nodes.isValueBlank(child))\n : children\n return nonEmptyChildren.length\n}\n\nconst isNodePointerToBeValidated = (nodePointer: NodePointer) => NodeDefs.hasMinOrMaxCount(nodePointer.nodeDef)\n\nconst validateNodePointer = (params: {\n record: ArenaRecord\n nodeCtx: ArenaRecordNode\n nodeDef: NodeDef<NodeDefType, NodeDefProps>\n}) => {\n const { record, nodeCtx, nodeDef } = params\n // Check children count only for applicable nodes\n if (Nodes.isChildApplicable(nodeCtx, nodeDef.uuid)) {\n const count = _countChildren({ record, parentNode: nodeCtx, childDef: nodeDef })\n return validateChildrenCount({ parentNode: nodeCtx, nodeDefChild: nodeDef, count })\n }\n return ValidationFactory.createInstance()\n}\n\nconst getNodePointersToValidate = (params: {\n survey: Survey\n record: ArenaRecord\n node: ArenaRecordNode\n}): NodePointer[] => {\n const { survey, record, node } = params\n const nodePointersToValidate: NodePointer[] = []\n\n const nodeDef = Surveys.getNodeDefByUuid({ uuid: node.nodeDefUuid, survey })\n\n const nodeParent = Records.getParent({ node })(record)\n if (nodeParent) {\n // always validate the node itself\n const nodePointer = { nodeCtx: nodeParent, nodeDef }\n if (isNodePointerToBeValidated(nodePointer)) {\n nodePointersToValidate.push(nodePointer)\n }\n }\n if (NodeDefs.isEntity(nodeDef) && !node.deleted) {\n // validate the count of every node def children\n const childDefs = Surveys.getNodeDefChildren({ survey, nodeDef })\n for (const childDef of childDefs) {\n const nodePointer = { nodeCtx: node, nodeDef: childDef }\n if (isNodePointerToBeValidated(nodePointer)) {\n nodePointersToValidate.push(nodePointer)\n }\n }\n }\n return nodePointersToValidate\n}\n\nconst validateChildrenCountNodesArray = (params: {\n survey: Survey\n record: ArenaRecord\n nodesArray: ArenaRecordNode[]\n}): ValidationFields => {\n const { survey, record, nodesArray } = params\n const validationsAcc: ValidationFields = {}\n for (const node of nodesArray) {\n const nodePointersToValidate = getNodePointersToValidate({ survey, record, node })\n\n for (const nodePointer of nodePointersToValidate) {\n const { nodeCtx, nodeDef } = nodePointer\n // check if validated already\n const validationChildrenCountKey = RecordValidations.getValidationChildrenCountKey({\n nodeParentUuid: nodeCtx.uuid,\n nodeDefChildUuid: nodeDef.uuid,\n })\n if (!(validationChildrenCountKey in validationsAcc)) {\n // validate the children count of this node pointer\n const validationNodePointer = validateNodePointer({ record, nodeCtx, nodeDef })\n validationsAcc[validationChildrenCountKey] = validationNodePointer\n }\n }\n }\n return validationsAcc\n}\n\nconst validateChildrenCountNodes = (params: {\n survey: Survey\n record: ArenaRecord\n nodes: { [key: string]: ArenaRecordNode }\n}): ValidationFields => validateChildrenCountNodesArray({ ...params, nodesArray: Object.values(params.nodes) })\n\nexport const CountValidator = {\n validateChildrenCount,\n validateChildrenCountNodesArray,\n validateChildrenCountNodes,\n}\n"]}
@@ -35,13 +35,12 @@ const validateRecord = (params) => __awaiter(void 0, void 0, void 0, function* (
35
35
  const nodesArray = [];
36
36
  const nodes = {};
37
37
  records_1.Records.visitDescendantsAndSelf({
38
- record,
39
38
  node: records_1.Records.getRoot(record),
40
39
  visitor: (node) => {
41
40
  nodesArray.push(node);
42
41
  nodes[node.uuid] = node;
43
42
  },
44
- });
43
+ })(record);
45
44
  return (0, exports.validateSortedNodes)(Object.assign(Object.assign({}, params), { nodesArray }));
46
45
  });
47
46
  exports.validateRecord = validateRecord;
@@ -1 +1 @@
1
- {"version":3,"file":"recordValidator.js","sourceRoot":"","sources":["../../../src/record/recordValidator/recordValidator.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,iDAAgE;AAChE,8DAA0D;AAC1D,wCAAoC;AACpC,6DAK6B;AAC7B,qDAAiD;AAE1C,MAAM,mBAAmB,GAAG,CAAO,MAAuC,EAAuB,EAAE;IACxG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAA;IAE7C,yBAAyB;IACzB,MAAM,oBAAoB,GAAG,MAAM,uCAAkB,CAAC,wCAAwC,iCACzF,MAAM,KACT,UAAU,IACV,CAAA;IAEF,4BAA4B;IAC5B,MAAM,oBAAoB,GAAG,+BAAc,CAAC,+BAA+B,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;IAE3G,uBAAuB;IACvB,OAAO,yBAAW,CAAC,mBAAmB,CACpC,8BAAiB,CAAC,cAAc,CAAC;QAC/B,KAAK,EAAE,IAAI;QACX,MAAM,kCACD,oBAAoB,GACpB,oBAAoB,CACxB;KACF,CAAC,CACH,CAAA;AACH,CAAC,CAAA,CAAA;AAtBY,QAAA,mBAAmB,GAAnB,mBAAmB,CAsB/B;AAEM,MAAM,aAAa,GAAG,CAAO,MAAiC,EAAuB,EAAE,kDAC5F,OAAA,IAAA,QAAA,mBAAmB,kCAAM,MAAM,KAAE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAG,CAAA,CAE7E,CAAC,CAF4E,CAAA;AADhE,QAAA,aAAa,GAAb,aAAa,CACmD;AAEtE,MAAM,cAAc,GAAG,CAAO,MAA6B,EAAuB,EAAE;IACzF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;IACzB,MAAM,UAAU,GAAsB,EAAE,CAAA;IACxC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,iBAAO,CAAC,uBAAuB,CAAC;QAC9B,MAAM;QACN,IAAI,EAAE,iBAAO,CAAC,OAAO,CAAC,MAAM,CAAE;QAC9B,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAChB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACrB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;QACzB,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,IAAA,QAAA,mBAAmB,kCAAM,MAAM,KAAE,UAAU,IAAG,CAAA;AACvD,CAAC,CAAA,CAAA;AAdY,QAAA,cAAc,GAAd,cAAc,CAc1B","sourcesContent":["import { ArenaRecordNode, NodesMap } from '../../node'\nimport { Validation, ValidationFactory } from '../../validation'\nimport { Validations } from '../../validation/validations'\nimport { Records } from '../records'\nimport {\n AttributesValidatorParams,\n AttributeValidator,\n RecordValidatorParams,\n SortedAttributesValidatorParams,\n} from './attributeValidator'\nimport { CountValidator } from './countVaildator'\n\nexport const validateSortedNodes = async (params: SortedAttributesValidatorParams): Promise<Validation> => {\n const { survey, record, nodesArray } = params\n\n // 1. validate attributes\n const attributeValidations = await AttributeValidator.validateSelfAndDependentSortedAttributes({\n ...params,\n nodesArray,\n })\n\n // 2. validate min/max count\n const nodeCountValidations = CountValidator.validateChildrenCountNodesArray({ survey, record, nodesArray })\n\n // 3. merge validations\n return Validations.recalculateValidity(\n ValidationFactory.createInstance({\n valid: true,\n fields: {\n ...attributeValidations,\n ...nodeCountValidations,\n },\n })\n )\n}\n\nexport const validateNodes = async (params: AttributesValidatorParams): Promise<Validation> =>\n validateSortedNodes({ ...params, nodesArray: Object.values(params.nodes) })\n\nexport const validateRecord = async (params: RecordValidatorParams): Promise<Validation> => {\n const { record } = params\n const nodesArray: ArenaRecordNode[] = []\n const nodes: NodesMap = {}\n Records.visitDescendantsAndSelf({\n record,\n node: Records.getRoot(record)!,\n visitor: (node) => {\n nodesArray.push(node)\n nodes[node.uuid] = node\n },\n })\n\n return validateSortedNodes({ ...params, nodesArray })\n}\n"]}
1
+ {"version":3,"file":"recordValidator.js","sourceRoot":"","sources":["../../../src/record/recordValidator/recordValidator.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,iDAAgE;AAChE,8DAA0D;AAC1D,wCAAoC;AACpC,6DAK6B;AAC7B,qDAAiD;AAE1C,MAAM,mBAAmB,GAAG,CAAO,MAAuC,EAAuB,EAAE;IACxG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAA;IAE7C,yBAAyB;IACzB,MAAM,oBAAoB,GAAG,MAAM,uCAAkB,CAAC,wCAAwC,iCACzF,MAAM,KACT,UAAU,IACV,CAAA;IAEF,4BAA4B;IAC5B,MAAM,oBAAoB,GAAG,+BAAc,CAAC,+BAA+B,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;IAE3G,uBAAuB;IACvB,OAAO,yBAAW,CAAC,mBAAmB,CACpC,8BAAiB,CAAC,cAAc,CAAC;QAC/B,KAAK,EAAE,IAAI;QACX,MAAM,kCACD,oBAAoB,GACpB,oBAAoB,CACxB;KACF,CAAC,CACH,CAAA;AACH,CAAC,CAAA,CAAA;AAtBY,QAAA,mBAAmB,GAAnB,mBAAmB,CAsB/B;AAEM,MAAM,aAAa,GAAG,CAAO,MAAiC,EAAuB,EAAE,kDAC5F,OAAA,IAAA,QAAA,mBAAmB,kCAAM,MAAM,KAAE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAG,CAAA,CAE7E,CAAC,CAF4E,CAAA;AADhE,QAAA,aAAa,GAAb,aAAa,CACmD;AAEtE,MAAM,cAAc,GAAG,CAAO,MAA6B,EAAuB,EAAE;IACzF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;IACzB,MAAM,UAAU,GAAsB,EAAE,CAAA;IACxC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,iBAAO,CAAC,uBAAuB,CAAC;QAC9B,IAAI,EAAE,iBAAO,CAAC,OAAO,CAAC,MAAM,CAAE;QAC9B,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAChB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACrB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;QACzB,CAAC;KACF,CAAC,CAAC,MAAM,CAAC,CAAA;IAEV,OAAO,IAAA,QAAA,mBAAmB,kCAAM,MAAM,KAAE,UAAU,IAAG,CAAA;AACvD,CAAC,CAAA,CAAA;AAbY,QAAA,cAAc,GAAd,cAAc,CAa1B","sourcesContent":["import { ArenaRecordNode, NodesMap } from '../../node'\nimport { Validation, ValidationFactory } from '../../validation'\nimport { Validations } from '../../validation/validations'\nimport { Records } from '../records'\nimport {\n AttributesValidatorParams,\n AttributeValidator,\n RecordValidatorParams,\n SortedAttributesValidatorParams,\n} from './attributeValidator'\nimport { CountValidator } from './countVaildator'\n\nexport const validateSortedNodes = async (params: SortedAttributesValidatorParams): Promise<Validation> => {\n const { survey, record, nodesArray } = params\n\n // 1. validate attributes\n const attributeValidations = await AttributeValidator.validateSelfAndDependentSortedAttributes({\n ...params,\n nodesArray,\n })\n\n // 2. validate min/max count\n const nodeCountValidations = CountValidator.validateChildrenCountNodesArray({ survey, record, nodesArray })\n\n // 3. merge validations\n return Validations.recalculateValidity(\n ValidationFactory.createInstance({\n valid: true,\n fields: {\n ...attributeValidations,\n ...nodeCountValidations,\n },\n })\n )\n}\n\nexport const validateNodes = async (params: AttributesValidatorParams): Promise<Validation> =>\n validateSortedNodes({ ...params, nodesArray: Object.values(params.nodes) })\n\nexport const validateRecord = async (params: RecordValidatorParams): Promise<Validation> => {\n const { record } = params\n const nodesArray: ArenaRecordNode[] = []\n const nodes: NodesMap = {}\n Records.visitDescendantsAndSelf({\n node: Records.getRoot(record)!,\n visitor: (node) => {\n nodesArray.push(node)\n nodes[node.uuid] = node\n },\n })(record)\n\n return validateSortedNodes({ ...params, nodesArray })\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { getCycle, getRoot, getNodes, getNodesArray, getNodeByUuid, getNodesByUuids, getNodesByDefUuid, getChild, getChildren, getParent, getParentCodeAttribute, getAncestorCodePath, getDependentCodeAttributes, getAncestor, getEntityKeyNodes, getEntityKeyNodesByDefUuid, getEntityKeyValues, getEntityKeyValuesByDefUuid, getEntitySiblings, getAttributeSiblings, getNodeIndex, visitAncestorsAndSelf, getAncestorsAndSelf, getDescendant, getDescendantsOrSelf, isDescendantOf, visitDescendantsAndSelf, getDependentNodePointers, findEntityByKeyValues, findEntityWithSameKeysInAnotherRecord, getCategoryItemUuid, isNodeEmpty, isNodeFilledByUser, isEmpty, getStep, isInAnalysisStep } from './_records/recordGetters';
1
+ import { getCycle, getRoot, getNodes, getNodesArray, getParentCodeAttribute, isDescendantOf, isEmpty, getStep, isInAnalysisStep } from './_records/recordGetters';
2
2
  import { addNode, addNodes } from './_records/recordUpdater';
3
3
  import { getEnumeratingCategoryItems, findDependentEnumeratedEntityDefsNotEmpty } from './_records/recordUtils';
4
4
  import { getEntityCompletionPercent, getEntityCompletionStats, getEntityOwnCompletionPercent, getRecordCompletionPercent } from './_records/recordCompletion';
@@ -9,47 +9,347 @@ export declare const Records: {
9
9
  getRoot: typeof getRoot;
10
10
  getNodes: typeof getNodes;
11
11
  getNodesArray: typeof getNodesArray;
12
- getNodeByUuid: typeof getNodeByUuid;
13
- getNodesByUuids: typeof getNodesByUuids;
14
- getNodesByDefUuid: typeof getNodesByDefUuid;
15
- getChild: typeof getChild;
16
- getChildren: typeof getChildren;
17
- getParent: typeof getParent;
12
+ getNodeByUuid: {
13
+ (params: {
14
+ uuid: string;
15
+ }): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode | undefined;
16
+ (uuid: string): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode | undefined;
17
+ };
18
+ getNodesByUuids: {
19
+ (params: {
20
+ uuids: string[];
21
+ }): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode[];
22
+ (uuids: string[]): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode[];
23
+ };
24
+ getNodesByDefUuid: {
25
+ (params: {
26
+ nodeDefUuid: string;
27
+ }): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode[];
28
+ (nodeDefUuid: string): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode[];
29
+ };
30
+ getChild: {
31
+ (params: {
32
+ parentNode: import("..").ArenaRecordNode;
33
+ childDefUuid: string;
34
+ }): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode;
35
+ (parentNode: import("..").ArenaRecordNode, childDefUuid: string): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode;
36
+ };
37
+ getChildren: {
38
+ (params: {
39
+ parentNode: import("..").ArenaRecordNode;
40
+ childDefUuid?: string;
41
+ }): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode[];
42
+ (parentNode: import("..").ArenaRecordNode, childDefUuid?: string | undefined): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode[];
43
+ };
44
+ getParent: {
45
+ (params: {
46
+ node: import("..").ArenaRecordNode;
47
+ }): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode | undefined;
48
+ (node: import("..").ArenaRecordNode): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode | undefined;
49
+ };
18
50
  getParentCodeAttribute: typeof getParentCodeAttribute;
19
- getAncestorCodePath: typeof getAncestorCodePath;
20
- getDependentCodeAttributes: typeof getDependentCodeAttributes;
21
- getAncestor: typeof getAncestor;
22
- getEntityKeyNodes: typeof getEntityKeyNodes;
23
- getEntityKeyNodesByDefUuid: typeof getEntityKeyNodesByDefUuid;
24
- getEntityKeyValues: typeof getEntityKeyValues;
25
- getEntityKeyValuesByDefUuid: typeof getEntityKeyValuesByDefUuid;
26
- getEntitySiblings: typeof getEntitySiblings;
27
- getAttributeSiblings: typeof getAttributeSiblings;
28
- getNodeIndex: typeof getNodeIndex;
29
- isNodeApplicable: (params: {
30
- record: import("./record").ArenaRecord;
31
- node: import("..").ArenaRecordNode;
32
- }) => boolean;
33
- isNodeEditable: (params: {
34
- record: import("./record").ArenaRecord;
35
- node: import("..").ArenaRecordNode;
36
- }) => boolean;
37
- isNodeVisible: (params: {
38
- record: import("./record").ArenaRecord;
39
- node: import("..").ArenaRecordNode;
40
- }) => boolean;
41
- visitAncestorsAndSelf: typeof visitAncestorsAndSelf;
42
- getAncestorsAndSelf: typeof getAncestorsAndSelf;
43
- getDescendant: typeof getDescendant;
44
- getDescendantsOrSelf: typeof getDescendantsOrSelf;
51
+ getAncestorCodePath: {
52
+ (params: {
53
+ survey: import("..").Survey;
54
+ record: import("./record").ArenaRecord;
55
+ parentNode: import("..").ArenaRecordNode;
56
+ nodeDef: import("..").NodeDef<import("..").NodeDefType.code, import("..").NodeDefCodeProps>;
57
+ }): string[];
58
+ (params: Omit<{
59
+ survey: import("..").Survey;
60
+ record: import("./record").ArenaRecord;
61
+ parentNode: import("..").ArenaRecordNode;
62
+ nodeDef: import("..").NodeDef<import("..").NodeDefType.code, import("..").NodeDefCodeProps>;
63
+ }, "record">): (record: import("./record").ArenaRecord) => string[];
64
+ };
65
+ getDependentCodeAttributes: {
66
+ (params: {
67
+ node: import("..").ArenaRecordNode;
68
+ }): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode[];
69
+ (node: import("..").ArenaRecordNode): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode[];
70
+ };
71
+ getAncestor: {
72
+ (params: {
73
+ record: import("./record").ArenaRecord;
74
+ node: import("..").ArenaRecordNode;
75
+ ancestorDefUuid: string;
76
+ }): import("..").ArenaRecordNode | undefined;
77
+ (params: Omit<{
78
+ record: import("./record").ArenaRecord;
79
+ node: import("..").ArenaRecordNode;
80
+ ancestorDefUuid: string;
81
+ }, "record">): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode | undefined;
82
+ };
83
+ getEntityKeyNodes: {
84
+ (params: {
85
+ survey: import("..").Survey;
86
+ cycle?: string;
87
+ record: import("./record").ArenaRecord;
88
+ entity: import("..").ArenaRecordNode;
89
+ keyDefs?: import("..").NodeDef<import("..").NodeDefType, import("..").NodeDefProps>[];
90
+ }): import("..").ArenaRecordNode[];
91
+ (params: Omit<{
92
+ survey: import("..").Survey;
93
+ cycle?: string;
94
+ record: import("./record").ArenaRecord;
95
+ entity: import("..").ArenaRecordNode;
96
+ keyDefs?: import("..").NodeDef<import("..").NodeDefType, import("..").NodeDefProps>[];
97
+ }, "record">): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode[];
98
+ };
99
+ getEntityKeyNodesByDefUuid: {
100
+ (params: {
101
+ survey: import("..").Survey;
102
+ cycle?: string;
103
+ record: import("./record").ArenaRecord;
104
+ entity: import("..").ArenaRecordNode;
105
+ keyDefs?: import("..").NodeDef<import("..").NodeDefType, import("..").NodeDefProps>[];
106
+ }): import("..").NodesMap;
107
+ (params: Omit<{
108
+ survey: import("..").Survey;
109
+ cycle?: string;
110
+ record: import("./record").ArenaRecord;
111
+ entity: import("..").ArenaRecordNode;
112
+ keyDefs?: import("..").NodeDef<import("..").NodeDefType, import("..").NodeDefProps>[];
113
+ }, "record">): (record: import("./record").ArenaRecord) => import("..").NodesMap;
114
+ };
115
+ getEntityKeyValues: {
116
+ (params: {
117
+ survey: import("..").Survey;
118
+ cycle?: string;
119
+ record: import("./record").ArenaRecord;
120
+ entity: import("..").ArenaRecordNode;
121
+ keyDefs?: import("..").NodeDef<import("..").NodeDefType, import("..").NodeDefProps>[];
122
+ }): any[];
123
+ (params: Omit<{
124
+ survey: import("..").Survey;
125
+ cycle?: string;
126
+ record: import("./record").ArenaRecord;
127
+ entity: import("..").ArenaRecordNode;
128
+ keyDefs?: import("..").NodeDef<import("..").NodeDefType, import("..").NodeDefProps>[];
129
+ }, "record">): (record: import("./record").ArenaRecord) => any[];
130
+ };
131
+ getEntityKeyValuesByDefUuid: {
132
+ (params: {
133
+ survey: import("..").Survey;
134
+ cycle?: string;
135
+ record: import("./record").ArenaRecord;
136
+ entity: import("..").ArenaRecordNode;
137
+ keyDefs?: import("..").NodeDef<import("..").NodeDefType, import("..").NodeDefProps>[];
138
+ }): import("..").Dictionary<any>;
139
+ (params: Omit<{
140
+ survey: import("..").Survey;
141
+ cycle?: string;
142
+ record: import("./record").ArenaRecord;
143
+ entity: import("..").ArenaRecordNode;
144
+ keyDefs?: import("..").NodeDef<import("..").NodeDefType, import("..").NodeDefProps>[];
145
+ }, "record">): (record: import("./record").ArenaRecord) => import("..").Dictionary<any>;
146
+ };
147
+ getEntitySiblings: {
148
+ (params: {
149
+ record: import("./record").ArenaRecord;
150
+ entity: import("..").ArenaRecordNode;
151
+ includeSelf?: boolean;
152
+ }): import("..").ArenaRecordNode[];
153
+ (params: Omit<{
154
+ record: import("./record").ArenaRecord;
155
+ entity: import("..").ArenaRecordNode;
156
+ includeSelf?: boolean;
157
+ }, "record">): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode[];
158
+ };
159
+ getAttributeSiblings: {
160
+ (params: {
161
+ record: import("./record").ArenaRecord;
162
+ node: import("..").ArenaRecordNode;
163
+ nodeDef: import("..").NodeDef<import("..").NodeDefType, import("..").NodeDefProps>;
164
+ }): import("..").ArenaRecordNode[];
165
+ (params: Omit<{
166
+ record: import("./record").ArenaRecord;
167
+ node: import("..").ArenaRecordNode;
168
+ nodeDef: import("..").NodeDef<import("..").NodeDefType, import("..").NodeDefProps>;
169
+ }, "record">): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode[];
170
+ };
171
+ getNodeIndex: {
172
+ (params: {
173
+ record: import("./record").ArenaRecord;
174
+ node: import("..").ArenaRecordNode;
175
+ }): number;
176
+ (params: Omit<{
177
+ record: import("./record").ArenaRecord;
178
+ node: import("..").ArenaRecordNode;
179
+ }, "record">): (record: import("./record").ArenaRecord) => number;
180
+ };
181
+ isNodeApplicable: {
182
+ (params: {
183
+ record: import("./record").ArenaRecord;
184
+ } & {
185
+ node: import("..").ArenaRecordNode;
186
+ }): boolean;
187
+ (params: Omit<{
188
+ record: import("./record").ArenaRecord;
189
+ } & {
190
+ node: import("..").ArenaRecordNode;
191
+ }, "record">): (record: import("./record").ArenaRecord) => boolean;
192
+ };
193
+ isNodeEditable: {
194
+ (params: {
195
+ record: import("./record").ArenaRecord;
196
+ } & {
197
+ node: import("..").ArenaRecordNode;
198
+ }): boolean;
199
+ (params: Omit<{
200
+ record: import("./record").ArenaRecord;
201
+ } & {
202
+ node: import("..").ArenaRecordNode;
203
+ }, "record">): (record: import("./record").ArenaRecord) => boolean;
204
+ };
205
+ isNodeVisible: {
206
+ (params: {
207
+ record: import("./record").ArenaRecord;
208
+ } & {
209
+ node: import("..").ArenaRecordNode;
210
+ }): boolean;
211
+ (params: Omit<{
212
+ record: import("./record").ArenaRecord;
213
+ } & {
214
+ node: import("..").ArenaRecordNode;
215
+ }, "record">): (record: import("./record").ArenaRecord) => boolean;
216
+ };
217
+ visitAncestorsAndSelf: {
218
+ (params: {
219
+ node: import("..").ArenaRecordNode;
220
+ visitor: (node: import("..").ArenaRecordNode) => boolean | void;
221
+ }): (record: import("./record").ArenaRecord) => void;
222
+ (node: import("..").ArenaRecordNode, visitor: (node: import("..").ArenaRecordNode) => void, stopIfFn?: (() => boolean) | undefined): (record: import("./record").ArenaRecord) => void;
223
+ };
224
+ getAncestorsAndSelf: {
225
+ (params: {
226
+ record: import("./record").ArenaRecord;
227
+ node: import("..").ArenaRecordNode;
228
+ }): import("..").ArenaRecordNode[];
229
+ (params: Omit<{
230
+ record: import("./record").ArenaRecord;
231
+ node: import("..").ArenaRecordNode;
232
+ }, "record">): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode[];
233
+ };
234
+ getDescendant: {
235
+ (params: {
236
+ record: import("./record").ArenaRecord;
237
+ node: import("..").ArenaRecordNode;
238
+ nodeDefDescendant: import("..").NodeDef<any>;
239
+ }): import("..").ArenaRecordNode;
240
+ (params: Omit<{
241
+ record: import("./record").ArenaRecord;
242
+ node: import("..").ArenaRecordNode;
243
+ nodeDefDescendant: import("..").NodeDef<any>;
244
+ }, "record">): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode;
245
+ };
246
+ getDescendantsOrSelf: {
247
+ (params: {
248
+ record: import("./record").ArenaRecord;
249
+ node: import("..").ArenaRecordNode;
250
+ nodeDefDescendant: import("..").NodeDef<any>;
251
+ }): import("..").ArenaRecordNode[];
252
+ (params: Omit<{
253
+ record: import("./record").ArenaRecord;
254
+ node: import("..").ArenaRecordNode;
255
+ nodeDefDescendant: import("..").NodeDef<any>;
256
+ }, "record">): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode[];
257
+ };
45
258
  isDescendantOf: typeof isDescendantOf;
46
- visitDescendantsAndSelf: typeof visitDescendantsAndSelf;
47
- getDependentNodePointers: typeof getDependentNodePointers;
48
- findEntityByKeyValues: typeof findEntityByKeyValues;
49
- findEntityWithSameKeysInAnotherRecord: typeof findEntityWithSameKeysInAnotherRecord;
50
- getCategoryItemUuid: typeof getCategoryItemUuid;
51
- isNodeEmpty: typeof isNodeEmpty;
52
- isNodeFilledByUser: typeof isNodeFilledByUser;
259
+ visitDescendantsAndSelf: {
260
+ (params: {
261
+ record: import("./record").ArenaRecord;
262
+ node: import("..").ArenaRecordNode;
263
+ visitor: (node: import("..").ArenaRecordNode) => boolean | void;
264
+ traverseMethod?: import("..").TraverseMethod;
265
+ }): void;
266
+ (params: Omit<{
267
+ record: import("./record").ArenaRecord;
268
+ node: import("..").ArenaRecordNode;
269
+ visitor: (node: import("..").ArenaRecordNode) => boolean | void;
270
+ traverseMethod?: import("..").TraverseMethod;
271
+ }, "record">): (record: import("./record").ArenaRecord) => void;
272
+ };
273
+ getDependentNodePointers: {
274
+ (params: {
275
+ survey: import("..").Survey;
276
+ record: import("./record").ArenaRecord;
277
+ node: import("..").ArenaRecordNode;
278
+ dependencyType: import("..").SurveyDependencyType;
279
+ includeSelf?: boolean;
280
+ filterFn?: (nodePointer: import("..").NodePointer) => boolean;
281
+ }): import("..").NodePointer[];
282
+ (params: Omit<{
283
+ survey: import("..").Survey;
284
+ record: import("./record").ArenaRecord;
285
+ node: import("..").ArenaRecordNode;
286
+ dependencyType: import("..").SurveyDependencyType;
287
+ includeSelf?: boolean;
288
+ filterFn?: (nodePointer: import("..").NodePointer) => boolean;
289
+ }, "record">): (record: import("./record").ArenaRecord) => import("..").NodePointer[];
290
+ };
291
+ findEntityByKeyValues: {
292
+ (params: {
293
+ survey: import("..").Survey;
294
+ cycle: string;
295
+ record: import("./record").ArenaRecord;
296
+ parentEntity: import("..").ArenaRecordNode;
297
+ entityDefUuid: string;
298
+ keyValuesByDefUuid: import("..").Dictionary<any>;
299
+ }): import("..").ArenaRecordNode | undefined;
300
+ (params: Omit<{
301
+ survey: import("..").Survey;
302
+ cycle: string;
303
+ record: import("./record").ArenaRecord;
304
+ parentEntity: import("..").ArenaRecordNode;
305
+ entityDefUuid: string;
306
+ keyValuesByDefUuid: import("..").Dictionary<any>;
307
+ }, "record">): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode | undefined;
308
+ };
309
+ findEntityWithSameKeysInAnotherRecord: {
310
+ (params: {
311
+ survey: import("..").Survey;
312
+ cycle: string;
313
+ entityUuid: string;
314
+ record: import("./record").ArenaRecord;
315
+ recordOther: import("./record").ArenaRecord;
316
+ }): import("..").ArenaRecordNode | undefined;
317
+ (params: Omit<{
318
+ survey: import("..").Survey;
319
+ cycle: string;
320
+ entityUuid: string;
321
+ record: import("./record").ArenaRecord;
322
+ recordOther: import("./record").ArenaRecord;
323
+ }, "record">): (record: import("./record").ArenaRecord) => import("..").ArenaRecordNode | undefined;
324
+ };
325
+ getCategoryItemUuid: {
326
+ (params: {
327
+ survey: import("..").Survey;
328
+ nodeDef: import("..").NodeDef<import("..").NodeDefType.code, import("..").NodeDefCodeProps>;
329
+ record: import("./record").ArenaRecord;
330
+ parentNode: import("..").ArenaRecordNode;
331
+ code: string;
332
+ }): string | undefined;
333
+ (params: Omit<{
334
+ survey: import("..").Survey;
335
+ nodeDef: import("..").NodeDef<import("..").NodeDefType.code, import("..").NodeDefCodeProps>;
336
+ record: import("./record").ArenaRecord;
337
+ parentNode: import("..").ArenaRecordNode;
338
+ code: string;
339
+ }, "record">): (record: import("./record").ArenaRecord) => string | undefined;
340
+ };
341
+ isNodeEmpty: {
342
+ (params: {
343
+ node: import("..").ArenaRecordNode;
344
+ }): (record: import("./record").ArenaRecord) => boolean;
345
+ (node: import("..").ArenaRecordNode): (record: import("./record").ArenaRecord) => boolean;
346
+ };
347
+ isNodeFilledByUser: {
348
+ (params: {
349
+ node: import("..").ArenaRecordNode;
350
+ }): (record: import("./record").ArenaRecord) => boolean;
351
+ (node: import("..").ArenaRecordNode): (record: import("./record").ArenaRecord) => boolean;
352
+ };
53
353
  isEmpty: typeof isEmpty;
54
354
  getStep: typeof getStep;
55
355
  isInAnalysisStep: typeof isInAnalysisStep;
@@ -1,7 +1,7 @@
1
1
  import { NodeDefMap } from '../nodeDef';
2
- type NodeDefsFixParams = {
2
+ import { MutationOptions } from '../utils/mutationOptions';
3
+ type NodeDefsFixParams = MutationOptions & {
3
4
  nodeDefs: NodeDefMap;
4
- sideEffect?: boolean;
5
5
  cycles: string[];
6
6
  };
7
7
  declare const fixNodeDefs: (params: NodeDefsFixParams) => {