@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.
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/node/nodes.js +12 -4
- package/dist/esm/node/nodes.js.map +1 -1
- package/dist/esm/record/_records/recordCompletion.js +3 -3
- package/dist/esm/record/_records/recordCompletion.js.map +1 -1
- package/dist/esm/record/_records/recordGetters.js +221 -143
- package/dist/esm/record/_records/recordGetters.js.map +1 -1
- package/dist/esm/record/_records/recordNodesIndexUpdater.js +6 -4
- package/dist/esm/record/_records/recordNodesIndexUpdater.js.map +1 -1
- package/dist/esm/record/_records/recordPagesValidation.js +5 -5
- package/dist/esm/record/_records/recordPagesValidation.js.map +1 -1
- package/dist/esm/record/_records/recordUpdateOptions.js.map +1 -1
- package/dist/esm/record/_records/recordUpdater.js +1 -1
- package/dist/esm/record/_records/recordUpdater.js.map +1 -1
- package/dist/esm/record/_records/recordUtils.js +3 -7
- package/dist/esm/record/_records/recordUtils.js.map +1 -1
- package/dist/esm/record/nodePointers.js +1 -1
- package/dist/esm/record/nodePointers.js.map +1 -1
- package/dist/esm/record/recordCloner.js +1 -1
- package/dist/esm/record/recordCloner.js.map +1 -1
- package/dist/esm/record/recordExpressionEvaluator/functions.js +4 -5
- package/dist/esm/record/recordExpressionEvaluator/functions.js.map +1 -1
- package/dist/esm/record/recordExpressionEvaluator/node/identifier/identifier.js +1 -1
- package/dist/esm/record/recordExpressionEvaluator/node/identifier/identifier.js.map +1 -1
- package/dist/esm/record/recordExpressionEvaluator/node/identifier/nodesFinder.js +2 -2
- package/dist/esm/record/recordExpressionEvaluator/node/identifier/nodesFinder.js.map +1 -1
- package/dist/esm/record/recordExpressionEvaluator/recordExpressionEvaluator.js +1 -1
- package/dist/esm/record/recordExpressionEvaluator/recordExpressionEvaluator.js.map +1 -1
- package/dist/esm/record/recordFixer.js +5 -5
- package/dist/esm/record/recordFixer.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordExpressionValueConverter.js +2 -8
- package/dist/esm/record/recordNodesUpdater/recordExpressionValueConverter.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsApplicableUpdater.js +7 -7
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsApplicableUpdater.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsBooleanUpdater.js +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsBooleanUpdater.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsCodeAttributesUpdater.js +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsCodeAttributesUpdater.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsCountUpdater.js +1 -6
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsCountUpdater.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsDefaultValuesUpdater.js +3 -4
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsDefaultValuesUpdater.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEditableUpdater.js +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEditableUpdater.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.js +3 -3
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.js +4 -9
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsFileNamesEvaluator.js +2 -3
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsFileNamesEvaluator.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsVisibleUpdater.js +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodeDependentsVisibleUpdater.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodesDeleter.js +2 -6
- package/dist/esm/record/recordNodesUpdater/recordNodesDeleter.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodesDependentsUpdaterCommons.js +2 -9
- package/dist/esm/record/recordNodesUpdater/recordNodesDependentsUpdaterCommons.js.map +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodesUpdater.js +1 -1
- package/dist/esm/record/recordNodesUpdater/recordNodesUpdater.js.map +1 -1
- package/dist/esm/record/recordPrettyPrinter.js +14 -12
- package/dist/esm/record/recordPrettyPrinter.js.map +1 -1
- package/dist/esm/record/recordUpdater.js +2 -2
- package/dist/esm/record/recordUpdater.js.map +1 -1
- package/dist/esm/record/recordValidator/attributeKeyValidator.js +4 -4
- package/dist/esm/record/recordValidator/attributeKeyValidator.js.map +1 -1
- package/dist/esm/record/recordValidator/attributeUniqueValidator.js +1 -1
- package/dist/esm/record/recordValidator/attributeUniqueValidator.js.map +1 -1
- package/dist/esm/record/recordValidator/attributeValidator.js +8 -10
- package/dist/esm/record/recordValidator/attributeValidator.js.map +1 -1
- package/dist/esm/record/recordValidator/countVaildator.js +2 -2
- package/dist/esm/record/recordValidator/countVaildator.js.map +1 -1
- package/dist/esm/record/recordValidator/recordValidator.js +1 -2
- package/dist/esm/record/recordValidator/recordValidator.js.map +1 -1
- package/dist/esm/survey/nodeDefsFixer.js.map +1 -1
- package/dist/esm/survey/surveys/_nodeDefs/nodeDefsIndex.js +2 -2
- package/dist/esm/survey/surveys/_nodeDefs/nodeDefsIndex.js.map +1 -1
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/mutationOptions.js +5 -0
- package/dist/esm/utils/mutationOptions.js.map +1 -0
- package/dist/esm/validation/index.js.map +1 -1
- package/dist/esm/validation/validations.js +26 -19
- package/dist/esm/validation/validations.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js.map +1 -1
- package/dist/node/nodes.d.ts +10 -3
- package/dist/node/nodes.js +12 -4
- package/dist/node/nodes.js.map +1 -1
- package/dist/record/_records/recordCompletion.js +3 -3
- package/dist/record/_records/recordCompletion.js.map +1 -1
- package/dist/record/_records/recordGetters.d.ts +104 -51
- package/dist/record/_records/recordGetters.js +221 -170
- package/dist/record/_records/recordGetters.js.map +1 -1
- package/dist/record/_records/recordNodesIndexUpdater.d.ts +6 -3
- package/dist/record/_records/recordNodesIndexUpdater.js +6 -4
- package/dist/record/_records/recordNodesIndexUpdater.js.map +1 -1
- package/dist/record/_records/recordPagesValidation.js +5 -5
- package/dist/record/_records/recordPagesValidation.js.map +1 -1
- package/dist/record/_records/recordUpdateOptions.d.ts +2 -2
- package/dist/record/_records/recordUpdateOptions.js.map +1 -1
- package/dist/record/_records/recordUpdater.js +1 -1
- package/dist/record/_records/recordUpdater.js.map +1 -1
- package/dist/record/_records/recordUtils.js +3 -7
- package/dist/record/_records/recordUtils.js.map +1 -1
- package/dist/record/nodePointers.js +1 -1
- package/dist/record/nodePointers.js.map +1 -1
- package/dist/record/recordCloner.js +1 -1
- package/dist/record/recordCloner.js.map +1 -1
- package/dist/record/recordExpressionEvaluator/functions.js +4 -5
- package/dist/record/recordExpressionEvaluator/functions.js.map +1 -1
- package/dist/record/recordExpressionEvaluator/node/identifier/identifier.js +1 -1
- package/dist/record/recordExpressionEvaluator/node/identifier/identifier.js.map +1 -1
- package/dist/record/recordExpressionEvaluator/node/identifier/nodesFinder.js +2 -2
- package/dist/record/recordExpressionEvaluator/node/identifier/nodesFinder.js.map +1 -1
- package/dist/record/recordExpressionEvaluator/recordExpressionEvaluator.js +1 -1
- package/dist/record/recordExpressionEvaluator/recordExpressionEvaluator.js.map +1 -1
- package/dist/record/recordFixer.js +5 -5
- package/dist/record/recordFixer.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordExpressionValueConverter.js +2 -8
- package/dist/record/recordNodesUpdater/recordExpressionValueConverter.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsApplicableUpdater.js +7 -7
- package/dist/record/recordNodesUpdater/recordNodeDependentsApplicableUpdater.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsBooleanUpdater.d.ts +2 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsBooleanUpdater.js +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsBooleanUpdater.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsCodeAttributesUpdater.js +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsCodeAttributesUpdater.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsCountUpdater.js +1 -6
- package/dist/record/recordNodesUpdater/recordNodeDependentsCountUpdater.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsDefaultValuesUpdater.js +3 -4
- package/dist/record/recordNodesUpdater/recordNodeDependentsDefaultValuesUpdater.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsEditableUpdater.js +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsEditableUpdater.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.js +3 -3
- package/dist/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.js +4 -9
- package/dist/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsFileNamesEvaluator.js +2 -3
- package/dist/record/recordNodesUpdater/recordNodeDependentsFileNamesEvaluator.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsVisibleUpdater.js +1 -1
- package/dist/record/recordNodesUpdater/recordNodeDependentsVisibleUpdater.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodesDeleter.js +2 -6
- package/dist/record/recordNodesUpdater/recordNodesDeleter.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodesDependentsUpdaterCommons.js +2 -9
- package/dist/record/recordNodesUpdater/recordNodesDependentsUpdaterCommons.js.map +1 -1
- package/dist/record/recordNodesUpdater/recordNodesUpdater.js +1 -1
- package/dist/record/recordNodesUpdater/recordNodesUpdater.js.map +1 -1
- package/dist/record/recordPrettyPrinter.js +14 -12
- package/dist/record/recordPrettyPrinter.js.map +1 -1
- package/dist/record/recordUpdater.js +2 -2
- package/dist/record/recordUpdater.js.map +1 -1
- package/dist/record/recordValidator/attributeKeyValidator.js +4 -4
- package/dist/record/recordValidator/attributeKeyValidator.js.map +1 -1
- package/dist/record/recordValidator/attributeUniqueValidator.js +1 -1
- package/dist/record/recordValidator/attributeUniqueValidator.js.map +1 -1
- package/dist/record/recordValidator/attributeValidator.js +8 -10
- package/dist/record/recordValidator/attributeValidator.js.map +1 -1
- package/dist/record/recordValidator/countVaildator.js +2 -2
- package/dist/record/recordValidator/countVaildator.js.map +1 -1
- package/dist/record/recordValidator/recordValidator.js +1 -2
- package/dist/record/recordValidator/recordValidator.js.map +1 -1
- package/dist/record/records.d.ts +340 -40
- package/dist/survey/nodeDefsFixer.d.ts +2 -2
- package/dist/survey/nodeDefsFixer.js.map +1 -1
- package/dist/survey/surveys/_nodeDefs/nodeDefsIndex.d.ts +3 -6
- package/dist/survey/surveys/_nodeDefs/nodeDefsIndex.js +2 -2
- package/dist/survey/surveys/_nodeDefs/nodeDefsIndex.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/mutationOptions.d.ts +14 -0
- package/dist/utils/mutationOptions.js +9 -0
- package/dist/utils/mutationOptions.js.map +1 -0
- package/dist/validation/index.d.ts +1 -0
- package/dist/validation/index.js.map +1 -1
- package/dist/validation/validations.d.ts +17 -2
- package/dist/validation/validations.js +26 -19
- package/dist/validation/validations.js.map +1 -1
- 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"]}
|
|
@@ -46,7 +46,7 @@ const validateChildrenCount = (params) => {
|
|
|
46
46
|
};
|
|
47
47
|
const _countChildren = (params) => {
|
|
48
48
|
const { record, parentNode, childDef } = params;
|
|
49
|
-
const children = Records.getChildren(parentNode, childDef.uuid)(record);
|
|
49
|
+
const children = Records.getChildren({ parentNode, childDefUuid: childDef.uuid })(record);
|
|
50
50
|
const nonEmptyChildren = NodeDefs.isAttribute(childDef)
|
|
51
51
|
? children.filter((child) => !Nodes.isValueBlank(child))
|
|
52
52
|
: children;
|
|
@@ -66,7 +66,7 @@ const getNodePointersToValidate = (params) => {
|
|
|
66
66
|
const { survey, record, node } = params;
|
|
67
67
|
const nodePointersToValidate = [];
|
|
68
68
|
const nodeDef = Surveys.getNodeDefByUuid({ uuid: node.nodeDefUuid, survey });
|
|
69
|
-
const nodeParent = Records.getParent(node)(record);
|
|
69
|
+
const nodeParent = Records.getParent({ node })(record);
|
|
70
70
|
if (nodeParent) {
|
|
71
71
|
// always validate the node itself
|
|
72
72
|
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"]}
|
|
@@ -30,13 +30,12 @@ export const validateRecord = (params) => __awaiter(void 0, void 0, void 0, func
|
|
|
30
30
|
const nodesArray = [];
|
|
31
31
|
const nodes = {};
|
|
32
32
|
Records.visitDescendantsAndSelf({
|
|
33
|
-
record,
|
|
34
33
|
node: Records.getRoot(record),
|
|
35
34
|
visitor: (node) => {
|
|
36
35
|
nodesArray.push(node);
|
|
37
36
|
nodes[node.uuid] = node;
|
|
38
37
|
},
|
|
39
|
-
});
|
|
38
|
+
})(record);
|
|
40
39
|
return validateSortedNodes(Object.assign(Object.assign({}, params), { nodesArray }));
|
|
41
40
|
});
|
|
42
41
|
//# sourceMappingURL=recordValidator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recordValidator.js","sourceRoot":"","sources":["../../../../src/record/recordValidator/recordValidator.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAc,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAEL,kBAAkB,GAGnB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,MAAM,CAAC,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,kBAAkB,CAAC,wCAAwC,iCACzF,MAAM,KACT,UAAU,IACV,CAAA;IAEF,4BAA4B;IAC5B,MAAM,oBAAoB,GAAG,cAAc,CAAC,+BAA+B,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;IAE3G,uBAAuB;IACvB,OAAO,WAAW,CAAC,mBAAmB,CACpC,iBAAiB,CAAC,cAAc,CAAC;QAC/B,KAAK,EAAE,IAAI;QACX,MAAM,kCACD,oBAAoB,GACpB,oBAAoB,CACxB;KACF,CAAC,CACH,CAAA;AACH,CAAC,CAAA,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,CAAO,MAAiC,EAAuB,EAAE,kDAC5F,OAAA,mBAAmB,iCAAM,MAAM,KAAE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAG,CAAA,CAE7E,CAAC,CAF4E,CAAA;AAE7E,MAAM,CAAC,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,OAAO,CAAC,uBAAuB,CAAC;QAC9B,
|
|
1
|
+
{"version":3,"file":"recordValidator.js","sourceRoot":"","sources":["../../../../src/record/recordValidator/recordValidator.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAc,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAEL,kBAAkB,GAGnB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,MAAM,CAAC,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,kBAAkB,CAAC,wCAAwC,iCACzF,MAAM,KACT,UAAU,IACV,CAAA;IAEF,4BAA4B;IAC5B,MAAM,oBAAoB,GAAG,cAAc,CAAC,+BAA+B,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;IAE3G,uBAAuB;IACvB,OAAO,WAAW,CAAC,mBAAmB,CACpC,iBAAiB,CAAC,cAAc,CAAC;QAC/B,KAAK,EAAE,IAAI;QACX,MAAM,kCACD,oBAAoB,GACpB,oBAAoB,CACxB;KACF,CAAC,CACH,CAAA;AACH,CAAC,CAAA,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,CAAO,MAAiC,EAAuB,EAAE,kDAC5F,OAAA,mBAAmB,iCAAM,MAAM,KAAE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAG,CAAA,CAE7E,CAAC,CAF4E,CAAA;AAE7E,MAAM,CAAC,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,OAAO,CAAC,uBAAuB,CAAC;QAC9B,IAAI,EAAE,OAAO,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,mBAAmB,iCAAM,MAAM,KAAE,UAAU,IAAG,CAAA;AACvD,CAAC,CAAA,CAAA","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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeDefsFixer.js","sourceRoot":"","sources":["../../../src/survey/nodeDefsFixer.ts"],"names":[],"mappings":"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","sourcesContent":["import { SystemError } from '../error'\nimport { NodeDef, NodeDefEntity, NodeDefMap, NodeDefs } from '../nodeDef'\nimport { NodeDefEntityLayoutChildItem } from '../nodeDef/types/entity'\nimport { Objects } from '../utils'\n\ntype NodeDefsFixParams = {\n nodeDefs: NodeDefMap\n
|
|
1
|
+
{"version":3,"file":"nodeDefsFixer.js","sourceRoot":"","sources":["../../../src/survey/nodeDefsFixer.ts"],"names":[],"mappings":"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","sourcesContent":["import { SystemError } from '../error'\nimport { NodeDef, NodeDefEntity, NodeDefMap, NodeDefs } from '../nodeDef'\nimport { NodeDefEntityLayoutChildItem } from '../nodeDef/types/entity'\nimport { Objects } from '../utils'\nimport { MutationOptions } from '../utils/mutationOptions'\n\ntype NodeDefsFixParams = MutationOptions & {\n nodeDefs: NodeDefMap\n cycles: string[]\n}\n\ntype NodeDefsInCycleFixParams = NodeDefsFixParams & {\n cycle: string\n}\n\ntype NodeDefFixParams = NodeDefsInCycleFixParams & {\n nodeDef: NodeDef<any>\n}\n\ntype LayoutPropFixParams = NodeDefFixParams & {\n propName: string\n}\n\ntype LayoutPropFixerFnParams = LayoutPropFixParams & { propOld: any }\n\nconst calculateNodeDefHierarchy = (params: { nodeDef: NodeDef<any>; nodeDefs: NodeDefMap }): string[] => {\n const { nodeDef, nodeDefs } = params\n const hiearchy = []\n const visitedNodeDefUuids = new Set<string>()\n let currentParentUuid = nodeDef.parentUuid\n while (currentParentUuid) {\n if (visitedNodeDefUuids.has(currentParentUuid)) {\n throw new SystemError('nodeDef.hierarchyCircularDependency', {\n nodeDefName: nodeDef.props?.name,\n nodeDefUuid: nodeDef.uuid,\n parentUuid: currentParentUuid,\n })\n }\n visitedNodeDefUuids.add(currentParentUuid)\n hiearchy.unshift(currentParentUuid)\n const currentParentNode = nodeDefs[currentParentUuid]\n if (!currentParentNode) {\n throw new SystemError('nodeDef.parentNotFound', {\n nodeDefName: nodeDef.props?.name,\n nodeDefUuid: nodeDef.uuid,\n parentUuid: currentParentUuid,\n })\n }\n currentParentUuid = currentParentNode.parentUuid\n }\n return hiearchy\n}\n\nconst fixHiearchy = (params: NodeDefFixParams): NodeDef<any> | null => {\n const { nodeDefs, nodeDef, sideEffect } = params\n const calculatedHierarchy = calculateNodeDefHierarchy({ nodeDefs, nodeDef })\n // compare the whole hierarchy: a node def moved to another parent at the same depth has a hierarchy with the same length\n return Objects.isEqual(calculatedHierarchy, NodeDefs.getMetaHieararchy(nodeDef))\n ? null\n : Objects.assocPath({ obj: nodeDef, path: ['meta', 'h'], value: calculatedHierarchy, sideEffect })\n}\n\nconst fixLayoutProp = (\n params: LayoutPropFixParams & { fixerFn: (params: LayoutPropFixerFnParams) => any }\n): NodeDef<any> | null => {\n const { cycle, nodeDef, propName, sideEffect, fixerFn } = params\n\n const propPath = ['props', 'layout', cycle, propName]\n\n const propOld = Objects.path(propPath)(nodeDef)\n\n if (Objects.isEmpty(propOld)) return null\n\n const propFixed = fixerFn({ ...params, propOld })\n\n if (Objects.isEqual(propOld, propFixed)) return null\n\n return Objects.assocPath({\n obj: nodeDef,\n path: propPath,\n value: propFixed,\n sideEffect,\n })\n}\n\nconst fixIndexChildren = (params: NodeDefFixParams): NodeDef<any> | null =>\n fixLayoutProp({\n ...params,\n propName: 'indexChildren',\n fixerFn: ({ nodeDefs, cycle, propOld: indexChildren }) =>\n (indexChildren as string[]).filter((childDefUuid) => {\n const childDef = nodeDefs[childDefUuid]\n return (\n childDef?.parentUuid === params.nodeDef.uuid &&\n NodeDefs.isEntity(childDef) &&\n NodeDefs.isDisplayInOwnPage(cycle)(childDef as NodeDefEntity)\n )\n }),\n })\n\nconst fixLayoutChildren = (params: NodeDefFixParams): NodeDef<any> | null =>\n fixLayoutProp({\n ...params,\n propName: 'layoutChildren',\n fixerFn: ({ nodeDefs, cycle, propOld: layoutChildren }) =>\n (layoutChildren as NodeDefEntityLayoutChildItem[]).filter((item) => {\n const childDefUuid = typeof item === 'string' ? item : item.i\n const childDef = nodeDefs[childDefUuid]\n return (\n childDef?.parentUuid === params.nodeDef.uuid &&\n (!NodeDefs.isEntity(childDef) || !NodeDefs.isDisplayInOwnPage(cycle)(childDef as NodeDefEntity))\n )\n }),\n })\n\nconst fix = (params: NodeDefFixParams): NodeDef<any> | null => {\n const { nodeDef } = params\n let nodeDefFixed: NodeDef<any> | null = fixHiearchy(params)\n if (NodeDefs.isEntity(nodeDef)) {\n nodeDefFixed = fixIndexChildren({ ...params, nodeDef: nodeDefFixed ?? nodeDef }) ?? nodeDefFixed\n nodeDefFixed = fixLayoutChildren({ ...params, nodeDef: nodeDefFixed ?? nodeDef }) ?? nodeDefFixed\n }\n return nodeDefFixed\n}\n\nconst fixNodeDefs = (params: NodeDefsFixParams): { nodeDefs: NodeDefMap; updatedNodeDefs: NodeDefMap } => {\n const { nodeDefs, cycles } = params\n const nodeDefsResult: NodeDefMap = {}\n const updatedNodeDefs: NodeDefMap = {}\n\n for (const cycle of cycles) {\n for (const nodeDef of Object.values(nodeDefs)) {\n const nodeDefToFix = nodeDefsResult[nodeDef.uuid] ?? nodeDef\n const fixedNodeDef = fix({ ...params, cycle, nodeDef: nodeDefToFix })\n if (fixedNodeDef) {\n updatedNodeDefs[nodeDef.uuid] = fixedNodeDef\n }\n nodeDefsResult[nodeDef.uuid] = fixedNodeDef ?? nodeDef\n }\n }\n return {\n nodeDefs: nodeDefsResult,\n updatedNodeDefs,\n }\n}\n\nexport const NodeDefsFixer = {\n fixNodeDefs,\n}\n"]}
|
|
@@ -18,8 +18,8 @@ export const getNodeDefsIndex = (survey) => {
|
|
|
18
18
|
return nodeDefsIndex || {};
|
|
19
19
|
};
|
|
20
20
|
// ==== UPDATE
|
|
21
|
-
export const addNodeDefToIndex = (nodeDef, options) => (survey) => {
|
|
22
|
-
const { sideEffect = false } = options
|
|
21
|
+
export const addNodeDefToIndex = (nodeDef, options = {}) => (survey) => {
|
|
22
|
+
const { sideEffect = false } = options;
|
|
23
23
|
const { analysis, parentUuid, temporary, uuid } = nodeDef;
|
|
24
24
|
const name = NodeDefs.getName(nodeDef);
|
|
25
25
|
let surveyUpdated = Objects.assocPath({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeDefsIndex.js","sourceRoot":"","sources":["../../../../../src/survey/surveys/_nodeDefs/nodeDefsIndex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"nodeDefsIndex.js","sourceRoot":"","sources":["../../../../../src/survey/surveys/_nodeDefs/nodeDefsIndex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAGxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEnD,MAAM,IAAI,GAAG;IACX,aAAa,EAAE,eAAe;CAC/B,CAAA;AAED,+FAA+F;AAC/F,iGAAiG;AACjG,MAAM,SAAS,GAA8C;IAC3D,gCAAgC,EAAE,kCAAkC;IACpE,iBAAiB,EAAE,mBAAmB;IACtC,uBAAuB,EAAE,yBAAyB;IAClD,WAAW,EAAE,aAAa;CAC3B,CAAA;AAED,YAAY;AAEZ,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAE,EAAE;IACjD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAAA;IAChC,OAAO,aAAa,IAAI,EAAE,CAAA;AAC5B,CAAC,CAAA;AAED,cAAc;AAEd,MAAM,CAAC,MAAM,iBAAiB,GAC5B,CAAC,OAAqB,EAAE,OAAO,GAAoB,EAAE,EAAE,EAAE,CACzD,CAAC,MAAc,EAAU,EAAE;IACzB,MAAM,EAAE,UAAU,GAAG,KAAK,EAAE,GAAG,OAAO,CAAA;IAEtC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;IACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAEtC,IAAI,aAAa,GAAW,OAAO,CAAC,SAAS,CAAC;QAC5C,GAAG,EAAE,MAAM;QACX,IAAI,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,iBAAiB,EAAE,IAAI,CAAC;QAC7D,KAAK,EAAE,OAAO,CAAC,IAAI;QACnB,UAAU;KACX,CAAC,CAAA;IAEF,IAAI,UAAU,EAAE,CAAC;QACf,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;YAChC,GAAG,EAAE,aAAa;YAClB,IAAI,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,gCAAgC,EAAE,UAAU,EAAE,IAAI,CAAC;YACxF,KAAK,EAAE,IAAI;YACX,UAAU;SACX,CAAW,CAAA;IACd,CAAC;SAAM,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnC,kBAAkB;QAClB,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;YAChC,GAAG,EAAE,aAAa;YAClB,IAAI,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,WAAW,CAAC;YACjD,KAAK,EAAE,IAAI;YACX,UAAU;SACX,CAAW,CAAA;IACd,CAAC;IAED,IAAI,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;YAChC,GAAG,EAAE,aAAa;YAClB,IAAI,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,uBAAuB,EAAE,IAAI,CAAC;YACnE,KAAK,EAAE,IAAI;YACX,UAAU;SACX,CAAW,CAAA;IACd,CAAC;IACD,OAAO,aAAa,CAAA;AACtB,CAAC,CAAA;AAEH,MAAM,CAAC,MAAM,4BAA4B,GACvC,CAAC,OAAqB,EAAE,eAA8B,EAAE,OAAyB,EAAE,EAAE,CACrF,CAAC,MAAc,EAAU,EAAE;IACzB,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAA;IACpC,IAAI,aAAa,GAAG,MAAM,CAAA;IAC1B,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7C,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC7E,IAAI,WAAW,KAAK,YAAY,EAAE,CAAC;QACjC,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;YACjC,GAAG,EAAE,aAAa;YAClB,IAAI,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,iBAAiB,EAAE,YAAY,CAAC;YACrE,UAAU;SACX,CAAC,CAAA;QACF,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;YAChC,GAAG,EAAE,aAAa;YAClB,IAAI,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,iBAAiB,EAAE,WAAW,CAAC;YACpE,KAAK,EAAE,OAAO,CAAC,IAAI;YACnB,UAAU;SACX,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,aAAa,CAAA;AACtB,CAAC,CAAA;AAEH,cAAc;AAEd,MAAM,CAAC,MAAM,kBAAkB,GAC7B,CAAC,OAAqB,EAAE,EAAE,CAC1B,CAAC,MAAc,EAAU,EAAE;;IACzB,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;IACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAEtC,IAAI,aAAa,GAAW,OAAO,CAAC,UAAU,CAAC;QAC7C,GAAG,EAAE,MAAM;QACX,IAAI,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,gCAAgC,EAAE,IAAI,CAAC;KAC7E,CAAC,CAAA;IAEF,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;QACjC,GAAG,EAAE,aAAa;QAClB,IAAI,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,iBAAiB,EAAE,IAAI,CAAC;KAC9D,CAAC,CAAA;IAEF,IAAI,UAAU,EAAE,CAAC;QACf,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;YACjC,GAAG,EAAE,aAAa;YAClB,IAAI,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,gCAAgC,EAAE,UAAU,EAAE,IAAI,CAAC;SACzF,CAAC,CAAA;IACJ,CAAC;SAAM,IAAI,CAAA,MAAA,MAAM,CAAC,aAAa,0CAAE,WAAW,MAAK,IAAI,EAAE,CAAC;QACtD,8FAA8F;QAC9F,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;YACjC,GAAG,EAAE,aAAa;YAClB,IAAI,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,WAAW,CAAC;SAClD,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;YACjC,GAAG,EAAE,aAAa;YAClB,IAAI,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,uBAAuB,EAAE,IAAI,CAAC;SACpE,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,aAAa,CAAA;AACtB,CAAC,CAAA;AAEH,cAAc;AAEd,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,MAAc,EAAU,EAAE;IACnE,MAAM,CAAC,aAAa,GAAG;QACrB,gCAAgC,EAAE,EAAE;QACpC,uBAAuB,EAAE,EAAE;KAC5B,CAAA;IACD,gBAAgB,CAAC,MAAM,CAAC;SACrB,IAAI,CAAC,CAAC,QAAsB,EAAE,QAAsB,EAAE,EAAE,sBAAC,OAAC,QAAQ,CAAC,EAAE,mCAAI,CAAC,CAAC,GAAG,OAAC,QAAQ,CAAC,EAAE,mCAAI,CAAC,CAAC,GAAA,CAAC;SACjG,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IAEjF,OAAO,MAAM,CAAA;AACf,CAAC,CAAA","sourcesContent":["import { NodeDef, NodeDefs } from '../../../nodeDef'\nimport { Objects } from '../../../utils'\nimport { MutationOptions } from '../../../utils/mutationOptions'\nimport { Survey, SurveyNodeDefsIndex } from '../../survey'\nimport { getNodeDefsArray } from './nodeDefsReader'\n\nconst keys = {\n nodeDefsIndex: 'nodeDefsIndex',\n}\n\n// keys and values must match: forces every property of SurveyNodeDefsIndex to be present here,\n// and a rename/typo on either side becomes a compile error instead of a silent runtime mismatch.\nconst indexKeys: { [K in keyof SurveyNodeDefsIndex]-?: K } = {\n childDefUuidPresenceByParentUuid: 'childDefUuidPresenceByParentUuid',\n nodeDefUuidByName: 'nodeDefUuidByName',\n qualifierPresenceByUuid: 'qualifierPresenceByUuid',\n rootDefUuid: 'rootDefUuid',\n}\n\n// ==== READ\n\nexport const getNodeDefsIndex = (survey: Survey) => {\n const { nodeDefsIndex } = survey\n return nodeDefsIndex || {}\n}\n\n// ==== UPDATE\n\nexport const addNodeDefToIndex =\n (nodeDef: NodeDef<any>, options: MutationOptions = {}) =>\n (survey: Survey): Survey => {\n const { sideEffect = false } = options\n\n const { analysis, parentUuid, temporary, uuid } = nodeDef\n const name = NodeDefs.getName(nodeDef)\n\n let surveyUpdated: Survey = Objects.assocPath({\n obj: survey,\n path: [keys.nodeDefsIndex, indexKeys.nodeDefUuidByName, name],\n value: nodeDef.uuid,\n sideEffect,\n })\n\n if (parentUuid) {\n surveyUpdated = Objects.assocPath({\n obj: surveyUpdated,\n path: [keys.nodeDefsIndex, indexKeys.childDefUuidPresenceByParentUuid, parentUuid, uuid],\n value: true,\n sideEffect,\n }) as Survey\n } else if (!temporary && !analysis) {\n // nodeDef is root\n surveyUpdated = Objects.assocPath({\n obj: surveyUpdated,\n path: [keys.nodeDefsIndex, indexKeys.rootDefUuid],\n value: uuid,\n sideEffect,\n }) as Survey\n }\n\n if (NodeDefs.isQualifier(nodeDef)) {\n surveyUpdated = Objects.assocPath({\n obj: surveyUpdated,\n path: [keys.nodeDefsIndex, indexKeys.qualifierPresenceByUuid, uuid],\n value: true,\n sideEffect,\n }) as Survey\n }\n return surveyUpdated\n }\n\nexport const updateNodeDefUuidByNameIndex =\n (nodeDef: NodeDef<any>, nodeDefPrevious?: NodeDef<any>, options?: MutationOptions) =>\n (survey: Survey): Survey => {\n const { sideEffect } = options ?? {}\n let surveyUpdated = survey\n const currentName = NodeDefs.getName(nodeDef)\n const previousName = nodeDefPrevious ? NodeDefs.getName(nodeDefPrevious) : ''\n if (currentName !== previousName) {\n surveyUpdated = Objects.dissocPath({\n obj: surveyUpdated,\n path: [keys.nodeDefsIndex, indexKeys.nodeDefUuidByName, previousName],\n sideEffect,\n })\n surveyUpdated = Objects.assocPath({\n obj: surveyUpdated,\n path: [keys.nodeDefsIndex, indexKeys.nodeDefUuidByName, currentName],\n value: nodeDef.uuid,\n sideEffect,\n })\n }\n return surveyUpdated\n }\n\n// ==== DELETE\n\nexport const deleteNodeDefIndex =\n (nodeDef: NodeDef<any>) =>\n (survey: Survey): Survey => {\n const { parentUuid, uuid } = nodeDef\n const name = NodeDefs.getName(nodeDef)\n\n let surveyUpdated: Survey = Objects.dissocPath({\n obj: survey,\n path: [keys.nodeDefsIndex, indexKeys.childDefUuidPresenceByParentUuid, uuid],\n })\n\n surveyUpdated = Objects.dissocPath({\n obj: surveyUpdated,\n path: [keys.nodeDefsIndex, indexKeys.nodeDefUuidByName, name],\n })\n\n if (parentUuid) {\n surveyUpdated = Objects.dissocPath({\n obj: surveyUpdated,\n path: [keys.nodeDefsIndex, indexKeys.childDefUuidPresenceByParentUuid, parentUuid, uuid],\n })\n } else if (survey.nodeDefsIndex?.rootDefUuid === uuid) {\n // node def is root (other node defs without parent, e.g. temporary or analysis ones, are not)\n surveyUpdated = Objects.dissocPath({\n obj: surveyUpdated,\n path: [keys.nodeDefsIndex, indexKeys.rootDefUuid],\n })\n }\n\n if (NodeDefs.isQualifier(nodeDef)) {\n surveyUpdated = Objects.dissocPath({\n obj: surveyUpdated,\n path: [keys.nodeDefsIndex, indexKeys.qualifierPresenceByUuid, uuid],\n })\n }\n return surveyUpdated\n }\n\n// ==== CREATE\n\nexport const buildAndAssocNodeDefsIndex = (survey: Survey): Survey => {\n survey.nodeDefsIndex = {\n childDefUuidPresenceByParentUuid: {},\n qualifierPresenceByUuid: {},\n }\n getNodeDefsArray(survey)\n .sort((nodeDef1: NodeDef<any>, nodeDef2: NodeDef<any>) => (nodeDef1.id ?? 0) - (nodeDef2.id ?? 0))\n .forEach((nodeDef) => addNodeDefToIndex(nodeDef, { sideEffect: true })(survey))\n\n return survey\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAG/C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA","sourcesContent":["export { Arrays } from './arrays'\nexport { Dates, DateFormats, UnitOfTime } from './dates'\nexport { FileNames } from './fileNames'\nexport { FileProcessor } from './fileProcessor'\nexport type { MutationOptions } from './mutationOptions'\nexport type { FileProcessorConstructorArgs } from './fileProcessor'\nexport { Numbers } from './numbers'\nexport { Objects } from './_objects'\nexport { Promises } from './promises'\nexport { Queue } from './queue'\nexport { RetryProcessor } from './retryProcessor'\nexport { Strings } from './strings'\nexport { UUIDs } from './uuids'\nexport { Versions } from './versions'\nexport type { ParsedVersion } from './versions'\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts the (deprecated) positional sideEffect boolean parameter into MutationOptions.
|
|
3
|
+
*/
|
|
4
|
+
export const toMutationOptions = (options) => typeof options === 'boolean' ? { sideEffect: options } : (options !== null && options !== void 0 ? options : {});
|
|
5
|
+
//# sourceMappingURL=mutationOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutationOptions.js","sourceRoot":"","sources":["../../../src/utils/mutationOptions.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAmC,EAAmB,EAAE,CACxF,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC,CAAA","sourcesContent":["/**\n * Options of the functions that return an updated version of the objects passed to them.\n */\nexport interface MutationOptions {\n /**\n * When true, the passed objects are modified in place instead of being copied: faster, but to be used only\n * on objects not shared with other code (e.g. objects just created). Default: false.\n */\n sideEffect?: boolean\n}\n\n/**\n * Converts the (deprecated) positional sideEffect boolean parameter into MutationOptions.\n */\nexport const toMutationOptions = (options?: MutationOptions | boolean): MutationOptions =>\n typeof options === 'boolean' ? { sideEffect: options } : (options ?? {})\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/validation/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAA;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/validation/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAA;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA","sourcesContent":["export type { FieldValidator } from './fieldValidator'\nexport { FieldValidators } from './fieldValidators'\nexport type { Validation, ValidationFields, ValidationResult, ValidationCounts } from './validation'\nexport { ValidationSeverity } from './validation'\nexport { ValidationFactory, ValidationResultFactory } from './factory'\nexport { ValidationResults } from './validationResults'\nexport { Validations } from './validations'\nexport type { DissocFieldValidationOptions } from './validations'\nexport { Validator } from './validator'\nexport { ValidatorErrorKeys } from './validatorErrorKeys'\n"]}
|
|
@@ -158,26 +158,33 @@ const mergeValidations = (validationNext, doCleanup = true) => (validationPrev)
|
|
|
158
158
|
validationResult.warnings = getWarnings(validationNext);
|
|
159
159
|
return doCleanup ? cleanup(validationResult) : recalculateValidity(validationResult);
|
|
160
160
|
};
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
161
|
+
const toDissocFieldValidationOptions = (options, doCleanup) => typeof options === 'boolean' || options === undefined ? { sideEffect: options, doCleanup } : options;
|
|
162
|
+
function dissocFieldValidation(fieldKey, options, doCleanupParam) {
|
|
163
|
+
const { sideEffect = false, doCleanup = true } = toDissocFieldValidationOptions(options, doCleanupParam);
|
|
164
|
+
return (validation) => {
|
|
165
|
+
const validationUpdated = Objects.dissocPath({ obj: validation, path: ['fields', fieldKey], sideEffect });
|
|
166
|
+
return doCleanup ? cleanup(validationUpdated) : validationUpdated;
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
function dissocFieldValidationsStartingWith(fieldStartsWith, options, doCleanupParam) {
|
|
170
|
+
const { sideEffect = false, doCleanup = true } = toDissocFieldValidationOptions(options, doCleanupParam);
|
|
171
|
+
return (validation) => {
|
|
172
|
+
if (!(validation === null || validation === void 0 ? void 0 : validation.fields))
|
|
173
|
+
return validation;
|
|
174
|
+
const fieldsUpdated = sideEffect ? validation.fields : Object.assign({}, validation.fields);
|
|
175
|
+
for (const fieldKey of Object.keys(fieldsUpdated)) {
|
|
176
|
+
if (fieldKey.startsWith(fieldStartsWith)) {
|
|
177
|
+
delete fieldsUpdated[fieldKey];
|
|
178
|
+
}
|
|
172
179
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
}
|
|
180
|
+
if (sideEffect) {
|
|
181
|
+
validation.fields = fieldsUpdated;
|
|
182
|
+
return validation;
|
|
183
|
+
}
|
|
184
|
+
const validationUpdated = Object.assign(Object.assign({}, validation), { fields: fieldsUpdated });
|
|
185
|
+
return doCleanup ? cleanup(validationUpdated) : validationUpdated;
|
|
186
|
+
};
|
|
187
|
+
}
|
|
181
188
|
const mergeValidation = (validationNext, doCleanup = true) => (validationPrev) => {
|
|
182
189
|
const validationFieldsResult = Object.assign({}, getFieldValidations(validationPrev));
|
|
183
190
|
const validationFieldsNext = getFieldValidations(validationNext);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validations.js","sourceRoot":"","sources":["../../../src/validation/validations.ts"],"names":[],"mappings":"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","sourcesContent":["import { Objects } from '../utils'\nimport { ValidationFactory } from './factory'\nimport { Validation, ValidationCounts, ValidationFields, ValidationResult } from './validation'\n\nconst keys = {\n counts: 'counts',\n errors: 'errors',\n fields: 'fields',\n valid: 'valid',\n validation: 'validation',\n warnings: 'warnings',\n}\n\nconst hasValidation = (obj: any): boolean => !!obj?.validation\n\nconst getValidation = (obj: any): Validation => obj?.validation || ValidationFactory.createInstance()\n\nconst getFieldValidations = (validation: Validation): ValidationFields => validation?.fields ?? {}\n\nconst getFieldValidationUnsafe =\n (field: string | number) =>\n (validation: Validation): Validation | undefined => {\n if (typeof field === 'string') {\n let validationCurrent: Validation | undefined = validation\n const parts = field.split('.')\n parts.some((part) => {\n validationCurrent = getFieldValidations(validationCurrent!)[part]\n return !validationCurrent // breaks the loop if there is no field validation\n })\n return validationCurrent\n } else {\n return getFieldValidations(validation)[field]\n }\n }\n\nconst getFieldValidation =\n (field: string | number, defaultValue: Validation = ValidationFactory.createInstance()) =>\n (validation: Validation): Validation =>\n getFieldValidationUnsafe(field)(validation) ?? defaultValue\n\nconst getFieldValidationsByFields =\n (fields: (string | number)[]) =>\n (validation: Validation): ValidationFields => {\n const result: ValidationFields = {}\n for (const field of fields) {\n const fieldValidation = getFieldValidationUnsafe(field)(validation)\n if (fieldValidation) {\n result[String(field)] = fieldValidation\n }\n }\n return result\n }\n\nconst getErrors = (validation: Validation): ValidationResult[] => validation?.errors ?? []\n\nconst getWarnings = (validation: Validation): ValidationResult[] => validation?.warnings ?? []\n\nconst hasErrors = (validation: Validation): boolean => {\n const errors = getErrors(validation)\n return !Objects.isEmpty(errors) || Object.values(getFieldValidations(validation)).some(hasErrors)\n}\n\nconst hasWarnings = (validation: Validation): boolean => {\n const warnings = getWarnings(validation)\n return !Objects.isEmpty(warnings) || Object.values(getFieldValidations(validation)).some(hasWarnings)\n}\n\nconst isValid = (validation: Validation): boolean => Objects.isEmpty(validation) || validation.valid\nconst isNotValid = (validation: Validation): boolean => !isValid(validation)\nconst isObjValid = (obj: Record<string, unknown>): boolean => isValid(getValidation(obj))\n\nconst getCounts = (validation: Validation): ValidationCounts | undefined => validation?.counts\nconst getErrorsCount = (validation: Validation): number => getCounts(validation)?.errors ?? 0\nconst getWarningsCount = (validation: Validation): number => getCounts(validation)?.warnings ?? 0\n\n/**\n * Creates a validation object like ValidationFactory.createInstance does, but without checking again\n * if fields is empty (checking it is O(N) for objects with many properties).\n */\nconst _createValidation = (params: {\n valid: boolean\n fields: ValidationFields\n hasFields: boolean\n errors: ValidationResult[]\n warnings: ValidationResult[]\n}): Validation => {\n const { valid, fields, hasFields, errors, warnings } = params\n const result: Validation = { valid }\n if (errors.length > 0) result.errors = errors\n if (hasFields) result.fields = fields\n if (warnings.length > 0) result.warnings = warnings\n return result\n}\n\nconst recalculateValidity = (validation: Validation): Validation => {\n let allFieldsValid = true\n let hasFields = false\n\n const fieldsWithValidationRecalculated: ValidationFields = {}\n\n for (const [fieldKey, fieldValidation] of Object.entries(getFieldValidations(validation))) {\n const fieldValidationUpdated = recalculateValidity(fieldValidation)\n fieldsWithValidationRecalculated[fieldKey] = fieldValidationUpdated\n hasFields = true\n if (!fieldValidationUpdated.valid) {\n allFieldsValid = false\n }\n }\n const errors = getErrors(validation)\n const warnings = getWarnings(validation)\n // nested errors and warnings already make the recalculated field validations not valid:\n // checking only own errors and warnings is enough (hasErrors/hasWarnings would visit the whole subtree again)\n const valid = allFieldsValid && errors.length === 0 && warnings.length === 0\n\n return _createValidation({ valid, fields: fieldsWithValidationRecalculated, hasFields, errors, warnings })\n}\n\nconst traverse = (visitor: (visitedItem: Validation) => void) => (validation: Validation) => {\n const stack: Validation[] = []\n stack.push(validation)\n\n while (stack.length) {\n const validationCurrent = stack.pop()!\n visitor(validationCurrent)\n // Add field validations to stack\n const validationFields = getFieldValidations(validationCurrent)\n stack.push(...Object.values(validationFields))\n }\n}\n\nconst calculateCounts = (validation: Validation): ValidationCounts => {\n let errors = 0\n let warnings = 0\n\n traverse((validationCurrent) => {\n errors += getErrors(validationCurrent).length\n warnings += getWarnings(validationCurrent).length\n })(validation)\n\n return {\n errors,\n warnings,\n }\n}\n\nconst updateCounts = (validation: Validation): Validation => ({\n ...validation,\n counts: calculateCounts(validation),\n})\n\nconst calculateHasNestedErrors = (validation: Validation): boolean => calculateCounts(validation).errors > 0\nconst calculateHasNestedWarnings = (validation: Validation): boolean => calculateCounts(validation).warnings > 0\n\nconst cleanup = (validation: Validation): Validation => {\n // only not valid field validations are kept\n let hasFields = false\n const fieldsCleaned: ValidationFields = {}\n for (const [field, fieldValidation] of Object.entries(getFieldValidations(validation))) {\n const fieldValidationCleaned = cleanup(fieldValidation)\n if (!fieldValidationCleaned.valid) {\n fieldsCleaned[field] = fieldValidationCleaned\n hasFields = true\n }\n }\n const errors = getErrors(validation)\n const warnings = getWarnings(validation)\n // nested errors and warnings already make the cleaned field validations not valid:\n // checking only own errors and warnings is enough (hasErrors/hasWarnings would visit the whole subtree again)\n const valid = !hasFields && errors.length === 0 && warnings.length === 0\n\n return _createValidation({ valid, fields: fieldsCleaned, hasFields, errors, warnings })\n}\n\nconst mergeValidations =\n (validationNext: Validation, doCleanup = true) =>\n (validationPrev: Validation): Validation => {\n const validationFieldsResult = { ...getFieldValidations(validationPrev) }\n const validationFieldsNext = getFieldValidations(validationNext)\n\n // iterate over new field validations: remove valid ones, merge invalid ones with previous ones\n for (const [fieldKey, validationFieldNext] of Object.entries(validationFieldsNext)) {\n if (isValid(validationFieldNext)) {\n if (doCleanup) {\n // field validation valid: remove it from resulting validation\n delete validationFieldsResult[fieldKey]\n } else {\n validationFieldsResult[fieldKey] = ValidationFactory.createInstance()\n }\n } else {\n // field validation not valid: deep merge it with the previous one\n const validationFieldPrev = validationFieldsResult[fieldKey]\n const validationFieldMerged = validationFieldPrev\n ? mergeValidation(validationFieldNext, false)(validationFieldPrev)\n : validationFieldNext\n validationFieldsResult[fieldKey] = validationFieldMerged\n }\n }\n const validationResult: Validation = { ...validationPrev, [keys.fields]: validationFieldsResult }\n validationResult.errors = getErrors(validationNext)\n validationResult.warnings = getWarnings(validationNext)\n return doCleanup ? cleanup(validationResult) : recalculateValidity(validationResult)\n }\n\nconst dissocFieldValidation =\n (fieldKey: string, sideEffect = false, doCleanup = true) =>\n (validation: Validation): Validation => {\n const validationUpdated = Objects.dissocPath({ obj: validation, path: ['fields', fieldKey], sideEffect })\n return doCleanup ? cleanup(validationUpdated) : validationUpdated\n }\n\nconst dissocFieldValidationsStartingWith =\n (fieldStartsWith: string, sideEffect = false, doCleanup = true) =>\n (validation: Validation): Validation => {\n if (!validation?.fields) return validation\n\n const fieldsUpdated = sideEffect ? validation.fields : { ...validation.fields }\n for (const fieldKey of Object.keys(fieldsUpdated)) {\n if (fieldKey.startsWith(fieldStartsWith)) {\n delete fieldsUpdated[fieldKey]\n }\n }\n if (sideEffect) {\n validation.fields = fieldsUpdated\n return validation\n }\n const validationUpdated = { ...validation, fields: fieldsUpdated }\n return doCleanup ? cleanup(validationUpdated) : validationUpdated\n }\n\nconst mergeValidation =\n (validationNext: Validation, doCleanup = true) =>\n (validationPrev: Validation): Validation => {\n const validationFieldsResult: ValidationFields = {\n ...getFieldValidations(validationPrev),\n }\n const validationFieldsNext = getFieldValidations(validationNext)\n\n // iterate over new field validations: remove valid ones, merge invalid ones with previous ones\n for (const [fieldKey, validationFieldNext] of Object.entries(validationFieldsNext)) {\n if (isValid(validationFieldNext)) {\n if (doCleanup) {\n // field validation valid: remove it from resulting validation\n delete validationFieldsResult[fieldKey]\n } else {\n validationFieldsResult[fieldKey] = ValidationFactory.createInstance()\n }\n } else {\n // field validation not valid: deep merge it with the previous one\n const validationFieldPrev = validationFieldsResult[fieldKey]\n const validationFieldMerged = validationFieldPrev\n ? mergeValidation(validationFieldNext, false)(validationFieldPrev)\n : validationFieldNext\n validationFieldsResult[fieldKey] = validationFieldMerged\n }\n }\n\n const validationResult: Validation = { ...validationPrev, fields: validationFieldsResult }\n validationResult.errors = getErrors(validationNext)\n validationResult.warnings = getWarnings(validationNext)\n\n return doCleanup ? cleanup(validationResult) : recalculateValidity(validationResult)\n }\n\nconst mergeFieldValidations = (\n fieldValidationsNext: ValidationFields,\n fieldValidationsPrev: ValidationFields\n): ValidationFields => {\n const result: ValidationFields = { ...fieldValidationsPrev }\n for (const [fieldKey, fieldValidationNext] of Object.entries(fieldValidationsNext)) {\n const fieldValidationPrev = fieldValidationsPrev[fieldKey]\n result[fieldKey] = fieldValidationPrev\n ? mergeValidation(fieldValidationNext, false)(fieldValidationPrev)\n : fieldValidationNext\n }\n return result\n}\n\nconst setValid = (valid: boolean) => (obj: object) => Objects.setInPath({ obj, path: [keys.valid], value: valid })\n\nconst setErrors = (errors: ValidationResult[]) => (obj: object) =>\n Objects.setInPath({ obj, path: [keys.errors], value: errors })\n\nconst setWarnings = (warnings: ValidationResult[]) => (obj: object) =>\n Objects.setInPath({ obj, path: [keys.warnings], value: warnings })\n\nconst setFieldValidations = (fieldValidations: ValidationFields) => (obj: object) =>\n Objects.setInPath({ obj, path: [keys.fields], value: fieldValidations })\n\nconst setFieldValidation = (field: string, fieldValidation: Validation) => (obj: object) =>\n Objects.setInPath({ obj, path: [keys.fields, field], value: fieldValidation })\n\nconst assocFieldValidation = (field: string, fieldValidation: Validation) => (validation: Validation) =>\n cleanup(Objects.assocPath({ obj: validation, path: [keys.fields, field], value: fieldValidation }))\n\nconst assocValidation = (v: Validation) => (obj: Record<string, unknown>) =>\n Objects.assoc({ obj, prop: 'validation', value: v })\n\nconst dissocValidation = (obj: Record<string, unknown>) => Objects.dissoc({ obj, prop: 'validation' })\n\nexport const Validations = {\n keys,\n hasValidation,\n getValidation,\n getFieldValidation,\n getFieldValidations,\n getFieldValidationsByFields,\n getErrors,\n getWarnings,\n hasErrors,\n hasWarnings,\n isValid,\n isNotValid,\n isObjValid,\n getCounts,\n getErrorsCount,\n getWarningsCount,\n recalculateValidity,\n traverse,\n calculateCounts,\n calculateHasNestedErrors,\n calculateHasNestedWarnings,\n updateCounts,\n cleanup,\n mergeValidations,\n dissocFieldValidation,\n dissocFieldValidationsStartingWith,\n mergeValidation,\n mergeFieldValidations,\n setValid,\n setErrors,\n setWarnings,\n setFieldValidations,\n assocFieldValidation,\n setFieldValidation,\n assocValidation,\n dissocValidation,\n}\n"]}
|
|
1
|
+
{"version":3,"file":"validations.js","sourceRoot":"","sources":["../../../src/validation/validations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAElC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAG7C,MAAM,IAAI,GAAG;IACX,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,UAAU,EAAE,YAAY;IACxB,QAAQ,EAAE,UAAU;CACrB,CAAA;AAED,MAAM,aAAa,GAAG,CAAC,GAAQ,EAAW,EAAE,CAAC,CAAC,EAAC,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,CAAA,CAAA;AAE9D,MAAM,aAAa,GAAG,CAAC,GAAQ,EAAc,EAAE,CAAC,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,UAAU,KAAI,iBAAiB,CAAC,cAAc,EAAE,CAAA;AAErG,MAAM,mBAAmB,GAAG,CAAC,UAAsB,EAAoB,EAAE,wBAAC,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,mCAAI,EAAE,GAAA,CAAA;AAElG,MAAM,wBAAwB,GAC5B,CAAC,KAAsB,EAAE,EAAE,CAC3B,CAAC,UAAsB,EAA0B,EAAE;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,iBAAiB,GAA2B,UAAU,CAAA;QAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC9B,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YAClB,iBAAiB,GAAG,mBAAmB,CAAC,iBAAkB,CAAC,CAAC,IAAI,CAAC,CAAA;YACjE,OAAO,CAAC,iBAAiB,CAAA,CAAC,kDAAkD;QAC9E,CAAC,CAAC,CAAA;QACF,OAAO,iBAAiB,CAAA;IAC1B,CAAC;SAAM,CAAC;QACN,OAAO,mBAAmB,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAA;IAC/C,CAAC;AACH,CAAC,CAAA;AAEH,MAAM,kBAAkB,GACtB,CAAC,KAAsB,EAAE,YAAY,GAAe,iBAAiB,CAAC,cAAc,EAAE,EAAE,EAAE,CAC1F,CAAC,UAAsB,EAAc,EAAE,wBACrC,wBAAwB,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,mCAAI,YAAY,GAAA,CAAA;AAE/D,MAAM,2BAA2B,GAC/B,CAAC,MAA2B,EAAE,EAAE,CAChC,CAAC,UAAsB,EAAoB,EAAE;IAC3C,MAAM,MAAM,GAAqB,EAAE,CAAA;IACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,eAAe,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAA;QACnE,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,eAAe,CAAA;QACzC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAEH,MAAM,SAAS,GAAG,CAAC,UAAsB,EAAsB,EAAE,wBAAC,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,mCAAI,EAAE,GAAA,CAAA;AAE1F,MAAM,WAAW,GAAG,CAAC,UAAsB,EAAsB,EAAE,wBAAC,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,QAAQ,mCAAI,EAAE,GAAA,CAAA;AAE9F,MAAM,SAAS,GAAG,CAAC,UAAsB,EAAW,EAAE;IACpD,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;IACpC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AACnG,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,UAAsB,EAAW,EAAE;IACtD,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,CAAA;IACxC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;AACvG,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,CAAC,UAAsB,EAAW,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,KAAK,CAAA;AACpG,MAAM,UAAU,GAAG,CAAC,UAAsB,EAAW,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;AAC5E,MAAM,UAAU,GAAG,CAAC,GAA4B,EAAW,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;AAEzF,MAAM,SAAS,GAAG,CAAC,UAAsB,EAAgC,EAAE,CAAC,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,CAAA;AAC9F,MAAM,cAAc,GAAG,CAAC,UAAsB,EAAU,EAAE,gCAAC,MAAA,SAAS,CAAC,UAAU,CAAC,0CAAE,MAAM,mCAAI,CAAC,GAAA,CAAA;AAC7F,MAAM,gBAAgB,GAAG,CAAC,UAAsB,EAAU,EAAE,gCAAC,MAAA,SAAS,CAAC,UAAU,CAAC,0CAAE,QAAQ,mCAAI,CAAC,GAAA,CAAA;AAEjG;;;GAGG;AACH,MAAM,iBAAiB,GAAG,CAAC,MAM1B,EAAc,EAAE;IACf,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAA;IAC7D,MAAM,MAAM,GAAe,EAAE,KAAK,EAAE,CAAA;IACpC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;IAC7C,IAAI,SAAS;QAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;IACrC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAA;IACnD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,UAAsB,EAAc,EAAE;IACjE,IAAI,cAAc,GAAG,IAAI,CAAA;IACzB,IAAI,SAAS,GAAG,KAAK,CAAA;IAErB,MAAM,gCAAgC,GAAqB,EAAE,CAAA;IAE7D,KAAK,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAC1F,MAAM,sBAAsB,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAAA;QACnE,gCAAgC,CAAC,QAAQ,CAAC,GAAG,sBAAsB,CAAA;QACnE,SAAS,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;YAClC,cAAc,GAAG,KAAK,CAAA;QACxB,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;IACpC,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,CAAA;IACxC,wFAAwF;IACxF,8GAA8G;IAC9G,MAAM,KAAK,GAAG,cAAc,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAA;IAE5E,OAAO,iBAAiB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,gCAAgC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;AAC5G,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,OAA0C,EAAE,EAAE,CAAC,CAAC,UAAsB,EAAE,EAAE;IAC1F,MAAM,KAAK,GAAiB,EAAE,CAAA;IAC9B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAEtB,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,iBAAiB,GAAG,KAAK,CAAC,GAAG,EAAG,CAAA;QACtC,OAAO,CAAC,iBAAiB,CAAC,CAAA;QAC1B,iCAAiC;QACjC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,CAAA;QAC/D,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAChD,CAAC;AACH,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,CAAC,UAAsB,EAAoB,EAAE;IACnE,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,IAAI,QAAQ,GAAG,CAAC,CAAA;IAEhB,QAAQ,CAAC,CAAC,iBAAiB,EAAE,EAAE;QAC7B,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAA;QAC7C,QAAQ,IAAI,WAAW,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAA;IACnD,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;IAEd,OAAO;QACL,MAAM;QACN,QAAQ;KACT,CAAA;AACH,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,CAAC,UAAsB,EAAc,EAAE,CAAC,iCACxD,UAAU,KACb,MAAM,EAAE,eAAe,CAAC,UAAU,CAAC,IACnC,CAAA;AAEF,MAAM,wBAAwB,GAAG,CAAC,UAAsB,EAAW,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;AAC5G,MAAM,0BAA0B,GAAG,CAAC,UAAsB,EAAW,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAA;AAEhH,MAAM,OAAO,GAAG,CAAC,UAAsB,EAAc,EAAE;IACrD,4CAA4C;IAC5C,IAAI,SAAS,GAAG,KAAK,CAAA;IACrB,MAAM,aAAa,GAAqB,EAAE,CAAA;IAC1C,KAAK,MAAM,CAAC,KAAK,EAAE,eAAe,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACvF,MAAM,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;QACvD,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;YAClC,aAAa,CAAC,KAAK,CAAC,GAAG,sBAAsB,CAAA;YAC7C,SAAS,GAAG,IAAI,CAAA;QAClB,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;IACpC,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,CAAA;IACxC,mFAAmF;IACnF,8GAA8G;IAC9G,MAAM,KAAK,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAA;IAExE,OAAO,iBAAiB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;AACzF,CAAC,CAAA;AAED,MAAM,gBAAgB,GACpB,CAAC,cAA0B,EAAE,SAAS,GAAG,IAAI,EAAE,EAAE,CACjD,CAAC,cAA0B,EAAc,EAAE;IACzC,MAAM,sBAAsB,qBAAQ,mBAAmB,CAAC,cAAc,CAAC,CAAE,CAAA;IACzE,MAAM,oBAAoB,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAA;IAEhE,+FAA+F;IAC/F,KAAK,MAAM,CAAC,QAAQ,EAAE,mBAAmB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACnF,IAAI,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACjC,IAAI,SAAS,EAAE,CAAC;gBACd,8DAA8D;gBAC9D,OAAO,sBAAsB,CAAC,QAAQ,CAAC,CAAA;YACzC,CAAC;iBAAM,CAAC;gBACN,sBAAsB,CAAC,QAAQ,CAAC,GAAG,iBAAiB,CAAC,cAAc,EAAE,CAAA;YACvE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,kEAAkE;YAClE,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAA;YAC5D,MAAM,qBAAqB,GAAG,mBAAmB;gBAC/C,CAAC,CAAC,eAAe,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC,mBAAmB,CAAC;gBAClE,CAAC,CAAC,mBAAmB,CAAA;YACvB,sBAAsB,CAAC,QAAQ,CAAC,GAAG,qBAAqB,CAAA;QAC1D,CAAC;IACH,CAAC;IACD,MAAM,gBAAgB,mCAAoB,cAAc,KAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,sBAAsB,GAAE,CAAA;IACjG,gBAAgB,CAAC,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,CAAA;IACnD,gBAAgB,CAAC,QAAQ,GAAG,WAAW,CAAC,cAAc,CAAC,CAAA;IACvD,OAAO,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAA;AACtF,CAAC,CAAA;AAaH,MAAM,8BAA8B,GAAG,CACrC,OAAgD,EAChD,SAAmB,EACW,EAAE,CAChC,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAA;AAYtG,SAAS,qBAAqB,CAC5B,QAAgB,EAChB,OAAgD,EAChD,cAAwB;IAExB,MAAM,EAAE,UAAU,GAAG,KAAK,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,8BAA8B,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;IACxG,OAAO,CAAC,UAAsB,EAAc,EAAE;QAC5C,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC,CAAA;QACzG,OAAO,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAA;IACnE,CAAC,CAAA;AACH,CAAC;AAYD,SAAS,kCAAkC,CACzC,eAAuB,EACvB,OAAgD,EAChD,cAAwB;IAExB,MAAM,EAAE,UAAU,GAAG,KAAK,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,8BAA8B,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;IACxG,OAAO,CAAC,UAAsB,EAAc,EAAE;QAC5C,IAAI,EAAC,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,CAAA;YAAE,OAAO,UAAU,CAAA;QAE1C,MAAM,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,mBAAM,UAAU,CAAC,MAAM,CAAE,CAAA;QAC/E,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YAClD,IAAI,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBACzC,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAA;YAChC,CAAC;QACH,CAAC;QACD,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,MAAM,GAAG,aAAa,CAAA;YACjC,OAAO,UAAU,CAAA;QACnB,CAAC;QACD,MAAM,iBAAiB,mCAAQ,UAAU,KAAE,MAAM,EAAE,aAAa,GAAE,CAAA;QAClE,OAAO,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAA;IACnE,CAAC,CAAA;AACH,CAAC;AAED,MAAM,eAAe,GACnB,CAAC,cAA0B,EAAE,SAAS,GAAG,IAAI,EAAE,EAAE,CACjD,CAAC,cAA0B,EAAc,EAAE;IACzC,MAAM,sBAAsB,qBACvB,mBAAmB,CAAC,cAAc,CAAC,CACvC,CAAA;IACD,MAAM,oBAAoB,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAA;IAEhE,+FAA+F;IAC/F,KAAK,MAAM,CAAC,QAAQ,EAAE,mBAAmB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACnF,IAAI,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACjC,IAAI,SAAS,EAAE,CAAC;gBACd,8DAA8D;gBAC9D,OAAO,sBAAsB,CAAC,QAAQ,CAAC,CAAA;YACzC,CAAC;iBAAM,CAAC;gBACN,sBAAsB,CAAC,QAAQ,CAAC,GAAG,iBAAiB,CAAC,cAAc,EAAE,CAAA;YACvE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,kEAAkE;YAClE,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAA;YAC5D,MAAM,qBAAqB,GAAG,mBAAmB;gBAC/C,CAAC,CAAC,eAAe,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC,mBAAmB,CAAC;gBAClE,CAAC,CAAC,mBAAmB,CAAA;YACvB,sBAAsB,CAAC,QAAQ,CAAC,GAAG,qBAAqB,CAAA;QAC1D,CAAC;IACH,CAAC;IAED,MAAM,gBAAgB,mCAAoB,cAAc,KAAE,MAAM,EAAE,sBAAsB,GAAE,CAAA;IAC1F,gBAAgB,CAAC,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,CAAA;IACnD,gBAAgB,CAAC,QAAQ,GAAG,WAAW,CAAC,cAAc,CAAC,CAAA;IAEvD,OAAO,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAA;AACtF,CAAC,CAAA;AAEH,MAAM,qBAAqB,GAAG,CAC5B,oBAAsC,EACtC,oBAAsC,EACpB,EAAE;IACpB,MAAM,MAAM,qBAA0B,oBAAoB,CAAE,CAAA;IAC5D,KAAK,MAAM,CAAC,QAAQ,EAAE,mBAAmB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACnF,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAA;QAC1D,MAAM,CAAC,QAAQ,CAAC,GAAG,mBAAmB;YACpC,CAAC,CAAC,eAAe,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC,mBAAmB,CAAC;YAClE,CAAC,CAAC,mBAAmB,CAAA;IACzB,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;AAElH,MAAM,SAAS,GAAG,CAAC,MAA0B,EAAE,EAAE,CAAC,CAAC,GAAW,EAAE,EAAE,CAChE,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;AAEhE,MAAM,WAAW,GAAG,CAAC,QAA4B,EAAE,EAAE,CAAC,CAAC,GAAW,EAAE,EAAE,CACpE,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;AAEpE,MAAM,mBAAmB,GAAG,CAAC,gBAAkC,EAAE,EAAE,CAAC,CAAC,GAAW,EAAE,EAAE,CAClF,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAA;AAE1E,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAE,eAA2B,EAAE,EAAE,CAAC,CAAC,GAAW,EAAE,EAAE,CACzF,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAA;AAEhF,MAAM,oBAAoB,GAAG,CAAC,KAAa,EAAE,eAA2B,EAAE,EAAE,CAAC,CAAC,UAAsB,EAAE,EAAE,CACtG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC,CAAA;AAErG,MAAM,eAAe,GAAG,CAAC,CAAa,EAAE,EAAE,CAAC,CAAC,GAA4B,EAAE,EAAE,CAC1E,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;AAEtD,MAAM,gBAAgB,GAAG,CAAC,GAA4B,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAA;AAEtG,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI;IACJ,aAAa;IACb,aAAa;IACb,kBAAkB;IAClB,mBAAmB;IACnB,2BAA2B;IAC3B,SAAS;IACT,WAAW;IACX,SAAS;IACT,WAAW;IACX,OAAO;IACP,UAAU;IACV,UAAU;IACV,SAAS;IACT,cAAc;IACd,gBAAgB;IAChB,mBAAmB;IACnB,QAAQ;IACR,eAAe;IACf,wBAAwB;IACxB,0BAA0B;IAC1B,YAAY;IACZ,OAAO;IACP,gBAAgB;IAChB,qBAAqB;IACrB,kCAAkC;IAClC,eAAe;IACf,qBAAqB;IACrB,QAAQ;IACR,SAAS;IACT,WAAW;IACX,mBAAmB;IACnB,oBAAoB;IACpB,kBAAkB;IAClB,eAAe;IACf,gBAAgB;CACjB,CAAA","sourcesContent":["import { Objects } from '../utils'\nimport { MutationOptions } from '../utils/mutationOptions'\nimport { ValidationFactory } from './factory'\nimport { Validation, ValidationCounts, ValidationFields, ValidationResult } from './validation'\n\nconst keys = {\n counts: 'counts',\n errors: 'errors',\n fields: 'fields',\n valid: 'valid',\n validation: 'validation',\n warnings: 'warnings',\n}\n\nconst hasValidation = (obj: any): boolean => !!obj?.validation\n\nconst getValidation = (obj: any): Validation => obj?.validation || ValidationFactory.createInstance()\n\nconst getFieldValidations = (validation: Validation): ValidationFields => validation?.fields ?? {}\n\nconst getFieldValidationUnsafe =\n (field: string | number) =>\n (validation: Validation): Validation | undefined => {\n if (typeof field === 'string') {\n let validationCurrent: Validation | undefined = validation\n const parts = field.split('.')\n parts.some((part) => {\n validationCurrent = getFieldValidations(validationCurrent!)[part]\n return !validationCurrent // breaks the loop if there is no field validation\n })\n return validationCurrent\n } else {\n return getFieldValidations(validation)[field]\n }\n }\n\nconst getFieldValidation =\n (field: string | number, defaultValue: Validation = ValidationFactory.createInstance()) =>\n (validation: Validation): Validation =>\n getFieldValidationUnsafe(field)(validation) ?? defaultValue\n\nconst getFieldValidationsByFields =\n (fields: (string | number)[]) =>\n (validation: Validation): ValidationFields => {\n const result: ValidationFields = {}\n for (const field of fields) {\n const fieldValidation = getFieldValidationUnsafe(field)(validation)\n if (fieldValidation) {\n result[String(field)] = fieldValidation\n }\n }\n return result\n }\n\nconst getErrors = (validation: Validation): ValidationResult[] => validation?.errors ?? []\n\nconst getWarnings = (validation: Validation): ValidationResult[] => validation?.warnings ?? []\n\nconst hasErrors = (validation: Validation): boolean => {\n const errors = getErrors(validation)\n return !Objects.isEmpty(errors) || Object.values(getFieldValidations(validation)).some(hasErrors)\n}\n\nconst hasWarnings = (validation: Validation): boolean => {\n const warnings = getWarnings(validation)\n return !Objects.isEmpty(warnings) || Object.values(getFieldValidations(validation)).some(hasWarnings)\n}\n\nconst isValid = (validation: Validation): boolean => Objects.isEmpty(validation) || validation.valid\nconst isNotValid = (validation: Validation): boolean => !isValid(validation)\nconst isObjValid = (obj: Record<string, unknown>): boolean => isValid(getValidation(obj))\n\nconst getCounts = (validation: Validation): ValidationCounts | undefined => validation?.counts\nconst getErrorsCount = (validation: Validation): number => getCounts(validation)?.errors ?? 0\nconst getWarningsCount = (validation: Validation): number => getCounts(validation)?.warnings ?? 0\n\n/**\n * Creates a validation object like ValidationFactory.createInstance does, but without checking again\n * if fields is empty (checking it is O(N) for objects with many properties).\n */\nconst _createValidation = (params: {\n valid: boolean\n fields: ValidationFields\n hasFields: boolean\n errors: ValidationResult[]\n warnings: ValidationResult[]\n}): Validation => {\n const { valid, fields, hasFields, errors, warnings } = params\n const result: Validation = { valid }\n if (errors.length > 0) result.errors = errors\n if (hasFields) result.fields = fields\n if (warnings.length > 0) result.warnings = warnings\n return result\n}\n\nconst recalculateValidity = (validation: Validation): Validation => {\n let allFieldsValid = true\n let hasFields = false\n\n const fieldsWithValidationRecalculated: ValidationFields = {}\n\n for (const [fieldKey, fieldValidation] of Object.entries(getFieldValidations(validation))) {\n const fieldValidationUpdated = recalculateValidity(fieldValidation)\n fieldsWithValidationRecalculated[fieldKey] = fieldValidationUpdated\n hasFields = true\n if (!fieldValidationUpdated.valid) {\n allFieldsValid = false\n }\n }\n const errors = getErrors(validation)\n const warnings = getWarnings(validation)\n // nested errors and warnings already make the recalculated field validations not valid:\n // checking only own errors and warnings is enough (hasErrors/hasWarnings would visit the whole subtree again)\n const valid = allFieldsValid && errors.length === 0 && warnings.length === 0\n\n return _createValidation({ valid, fields: fieldsWithValidationRecalculated, hasFields, errors, warnings })\n}\n\nconst traverse = (visitor: (visitedItem: Validation) => void) => (validation: Validation) => {\n const stack: Validation[] = []\n stack.push(validation)\n\n while (stack.length) {\n const validationCurrent = stack.pop()!\n visitor(validationCurrent)\n // Add field validations to stack\n const validationFields = getFieldValidations(validationCurrent)\n stack.push(...Object.values(validationFields))\n }\n}\n\nconst calculateCounts = (validation: Validation): ValidationCounts => {\n let errors = 0\n let warnings = 0\n\n traverse((validationCurrent) => {\n errors += getErrors(validationCurrent).length\n warnings += getWarnings(validationCurrent).length\n })(validation)\n\n return {\n errors,\n warnings,\n }\n}\n\nconst updateCounts = (validation: Validation): Validation => ({\n ...validation,\n counts: calculateCounts(validation),\n})\n\nconst calculateHasNestedErrors = (validation: Validation): boolean => calculateCounts(validation).errors > 0\nconst calculateHasNestedWarnings = (validation: Validation): boolean => calculateCounts(validation).warnings > 0\n\nconst cleanup = (validation: Validation): Validation => {\n // only not valid field validations are kept\n let hasFields = false\n const fieldsCleaned: ValidationFields = {}\n for (const [field, fieldValidation] of Object.entries(getFieldValidations(validation))) {\n const fieldValidationCleaned = cleanup(fieldValidation)\n if (!fieldValidationCleaned.valid) {\n fieldsCleaned[field] = fieldValidationCleaned\n hasFields = true\n }\n }\n const errors = getErrors(validation)\n const warnings = getWarnings(validation)\n // nested errors and warnings already make the cleaned field validations not valid:\n // checking only own errors and warnings is enough (hasErrors/hasWarnings would visit the whole subtree again)\n const valid = !hasFields && errors.length === 0 && warnings.length === 0\n\n return _createValidation({ valid, fields: fieldsCleaned, hasFields, errors, warnings })\n}\n\nconst mergeValidations =\n (validationNext: Validation, doCleanup = true) =>\n (validationPrev: Validation): Validation => {\n const validationFieldsResult = { ...getFieldValidations(validationPrev) }\n const validationFieldsNext = getFieldValidations(validationNext)\n\n // iterate over new field validations: remove valid ones, merge invalid ones with previous ones\n for (const [fieldKey, validationFieldNext] of Object.entries(validationFieldsNext)) {\n if (isValid(validationFieldNext)) {\n if (doCleanup) {\n // field validation valid: remove it from resulting validation\n delete validationFieldsResult[fieldKey]\n } else {\n validationFieldsResult[fieldKey] = ValidationFactory.createInstance()\n }\n } else {\n // field validation not valid: deep merge it with the previous one\n const validationFieldPrev = validationFieldsResult[fieldKey]\n const validationFieldMerged = validationFieldPrev\n ? mergeValidation(validationFieldNext, false)(validationFieldPrev)\n : validationFieldNext\n validationFieldsResult[fieldKey] = validationFieldMerged\n }\n }\n const validationResult: Validation = { ...validationPrev, [keys.fields]: validationFieldsResult }\n validationResult.errors = getErrors(validationNext)\n validationResult.warnings = getWarnings(validationNext)\n return doCleanup ? cleanup(validationResult) : recalculateValidity(validationResult)\n }\n\n/**\n * Options of the functions removing field validations.\n */\nexport interface DissocFieldValidationOptions extends MutationOptions {\n /**\n * When true (default), the validation is cleaned up after removing the field validations (empty field validations\n * removed and validity recalculated).\n */\n doCleanup?: boolean\n}\n\nconst toDissocFieldValidationOptions = (\n options?: DissocFieldValidationOptions | boolean,\n doCleanup?: boolean\n): DissocFieldValidationOptions =>\n typeof options === 'boolean' || options === undefined ? { sideEffect: options, doCleanup } : options\n\nfunction dissocFieldValidation(\n fieldKey: string,\n options?: DissocFieldValidationOptions\n): (validation: Validation) => Validation\n/** @deprecated Pass the options object instead of the positional booleans: `{ sideEffect, doCleanup }` */\nfunction dissocFieldValidation(\n fieldKey: string,\n sideEffect?: boolean,\n doCleanup?: boolean\n): (validation: Validation) => Validation\nfunction dissocFieldValidation(\n fieldKey: string,\n options?: DissocFieldValidationOptions | boolean,\n doCleanupParam?: boolean\n): (validation: Validation) => Validation {\n const { sideEffect = false, doCleanup = true } = toDissocFieldValidationOptions(options, doCleanupParam)\n return (validation: Validation): Validation => {\n const validationUpdated = Objects.dissocPath({ obj: validation, path: ['fields', fieldKey], sideEffect })\n return doCleanup ? cleanup(validationUpdated) : validationUpdated\n }\n}\n\nfunction dissocFieldValidationsStartingWith(\n fieldStartsWith: string,\n options?: DissocFieldValidationOptions\n): (validation: Validation) => Validation\n/** @deprecated Pass the options object instead of the positional booleans: `{ sideEffect, doCleanup }` */\nfunction dissocFieldValidationsStartingWith(\n fieldStartsWith: string,\n sideEffect?: boolean,\n doCleanup?: boolean\n): (validation: Validation) => Validation\nfunction dissocFieldValidationsStartingWith(\n fieldStartsWith: string,\n options?: DissocFieldValidationOptions | boolean,\n doCleanupParam?: boolean\n): (validation: Validation) => Validation {\n const { sideEffect = false, doCleanup = true } = toDissocFieldValidationOptions(options, doCleanupParam)\n return (validation: Validation): Validation => {\n if (!validation?.fields) return validation\n\n const fieldsUpdated = sideEffect ? validation.fields : { ...validation.fields }\n for (const fieldKey of Object.keys(fieldsUpdated)) {\n if (fieldKey.startsWith(fieldStartsWith)) {\n delete fieldsUpdated[fieldKey]\n }\n }\n if (sideEffect) {\n validation.fields = fieldsUpdated\n return validation\n }\n const validationUpdated = { ...validation, fields: fieldsUpdated }\n return doCleanup ? cleanup(validationUpdated) : validationUpdated\n }\n}\n\nconst mergeValidation =\n (validationNext: Validation, doCleanup = true) =>\n (validationPrev: Validation): Validation => {\n const validationFieldsResult: ValidationFields = {\n ...getFieldValidations(validationPrev),\n }\n const validationFieldsNext = getFieldValidations(validationNext)\n\n // iterate over new field validations: remove valid ones, merge invalid ones with previous ones\n for (const [fieldKey, validationFieldNext] of Object.entries(validationFieldsNext)) {\n if (isValid(validationFieldNext)) {\n if (doCleanup) {\n // field validation valid: remove it from resulting validation\n delete validationFieldsResult[fieldKey]\n } else {\n validationFieldsResult[fieldKey] = ValidationFactory.createInstance()\n }\n } else {\n // field validation not valid: deep merge it with the previous one\n const validationFieldPrev = validationFieldsResult[fieldKey]\n const validationFieldMerged = validationFieldPrev\n ? mergeValidation(validationFieldNext, false)(validationFieldPrev)\n : validationFieldNext\n validationFieldsResult[fieldKey] = validationFieldMerged\n }\n }\n\n const validationResult: Validation = { ...validationPrev, fields: validationFieldsResult }\n validationResult.errors = getErrors(validationNext)\n validationResult.warnings = getWarnings(validationNext)\n\n return doCleanup ? cleanup(validationResult) : recalculateValidity(validationResult)\n }\n\nconst mergeFieldValidations = (\n fieldValidationsNext: ValidationFields,\n fieldValidationsPrev: ValidationFields\n): ValidationFields => {\n const result: ValidationFields = { ...fieldValidationsPrev }\n for (const [fieldKey, fieldValidationNext] of Object.entries(fieldValidationsNext)) {\n const fieldValidationPrev = fieldValidationsPrev[fieldKey]\n result[fieldKey] = fieldValidationPrev\n ? mergeValidation(fieldValidationNext, false)(fieldValidationPrev)\n : fieldValidationNext\n }\n return result\n}\n\nconst setValid = (valid: boolean) => (obj: object) => Objects.setInPath({ obj, path: [keys.valid], value: valid })\n\nconst setErrors = (errors: ValidationResult[]) => (obj: object) =>\n Objects.setInPath({ obj, path: [keys.errors], value: errors })\n\nconst setWarnings = (warnings: ValidationResult[]) => (obj: object) =>\n Objects.setInPath({ obj, path: [keys.warnings], value: warnings })\n\nconst setFieldValidations = (fieldValidations: ValidationFields) => (obj: object) =>\n Objects.setInPath({ obj, path: [keys.fields], value: fieldValidations })\n\nconst setFieldValidation = (field: string, fieldValidation: Validation) => (obj: object) =>\n Objects.setInPath({ obj, path: [keys.fields, field], value: fieldValidation })\n\nconst assocFieldValidation = (field: string, fieldValidation: Validation) => (validation: Validation) =>\n cleanup(Objects.assocPath({ obj: validation, path: [keys.fields, field], value: fieldValidation }))\n\nconst assocValidation = (v: Validation) => (obj: Record<string, unknown>) =>\n Objects.assoc({ obj, prop: 'validation', value: v })\n\nconst dissocValidation = (obj: Record<string, unknown>) => Objects.dissoc({ obj, prop: 'validation' })\n\nexport const Validations = {\n keys,\n hasValidation,\n getValidation,\n getFieldValidation,\n getFieldValidations,\n getFieldValidationsByFields,\n getErrors,\n getWarnings,\n hasErrors,\n hasWarnings,\n isValid,\n isNotValid,\n isObjValid,\n getCounts,\n getErrorsCount,\n getWarningsCount,\n recalculateValidity,\n traverse,\n calculateCounts,\n calculateHasNestedErrors,\n calculateHasNestedWarnings,\n updateCounts,\n cleanup,\n mergeValidations,\n dissocFieldValidation,\n dissocFieldValidationsStartingWith,\n mergeValidation,\n mergeFieldValidations,\n setValid,\n setErrors,\n setWarnings,\n setFieldValidations,\n assocFieldValidation,\n setFieldValidation,\n assocValidation,\n dissocValidation,\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -44,6 +44,6 @@ export type { VernacularNameParams, TaxonomyFactoryParams, TaxonFactoryParams, T
|
|
|
44
44
|
export { SurveyBuilder, SurveyObjectBuilders } from './tests/builder/surveyBuilder';
|
|
45
45
|
export { RecordBuilder, RecordNodeBuilders } from './tests/builder/recordBuilder';
|
|
46
46
|
export { Arrays, DateFormats, Dates, FileNames, FileProcessor, Numbers, Objects, Promises, Queue, RetryProcessor, Strings, UnitOfTime, UUIDs, Versions, } from './utils';
|
|
47
|
-
export type { FileProcessorConstructorArgs, ParsedVersion } from './utils';
|
|
47
|
+
export type { FileProcessorConstructorArgs, MutationOptions, ParsedVersion } from './utils';
|
|
48
48
|
export { FieldValidators, ValidationFactory, ValidationResultFactory, ValidationResults, Validations, ValidationSeverity, Validator, ValidatorErrorKeys, } from './validation';
|
|
49
|
-
export type { FieldValidator, Validation, ValidationFields, ValidationResult, ValidationCounts } from './validation';
|
|
49
|
+
export type { DissocFieldValidationOptions, FieldValidator, Validation, ValidationFields, ValidationResult, ValidationCounts, } from './validation';
|