@openforis/arena-core 2.3.40 → 2.3.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/dist/auth/authorizer.d.ts +3 -3
  2. package/dist/auth/authorizer.js.map +1 -1
  3. package/dist/esm/auth/authorizer.js.map +1 -1
  4. package/dist/esm/index.js.map +1 -1
  5. package/dist/esm/node/factory.js.map +1 -1
  6. package/dist/esm/node/index.js.map +1 -1
  7. package/dist/esm/node/node.js.map +1 -1
  8. package/dist/esm/node/nodePointer.js.map +1 -1
  9. package/dist/esm/node/nodeValueFormatter.js.map +1 -1
  10. package/dist/esm/node/nodeValues.js.map +1 -1
  11. package/dist/esm/node/nodes.js +13 -5
  12. package/dist/esm/node/nodes.js.map +1 -1
  13. package/dist/esm/node/service.js.map +1 -1
  14. package/dist/esm/nodeDefExpressionEvaluator/functions.js.map +1 -1
  15. package/dist/esm/record/_records/recordCompletion.js.map +1 -1
  16. package/dist/esm/record/_records/recordGetters.js.map +1 -1
  17. package/dist/esm/record/_records/recordNodesIndexUpdater.js +6 -4
  18. package/dist/esm/record/_records/recordNodesIndexUpdater.js.map +1 -1
  19. package/dist/esm/record/_records/recordPagesValidation.js.map +1 -1
  20. package/dist/esm/record/_records/recordUpdateOptions.js.map +1 -1
  21. package/dist/esm/record/_records/recordUpdater.js +1 -1
  22. package/dist/esm/record/_records/recordUpdater.js.map +1 -1
  23. package/dist/esm/record/_records/recordUtils.js.map +1 -1
  24. package/dist/esm/record/factory.js.map +1 -1
  25. package/dist/esm/record/index.js.map +1 -1
  26. package/dist/esm/record/nodePointers.js.map +1 -1
  27. package/dist/esm/record/record.js.map +1 -1
  28. package/dist/esm/record/recordCloner.js.map +1 -1
  29. package/dist/esm/record/recordExpressionEvaluator/context.js.map +1 -1
  30. package/dist/esm/record/recordExpressionEvaluator/node/identifier/identifier.js.map +1 -1
  31. package/dist/esm/record/recordExpressionEvaluator/node/identifier/nodesFinder.js.map +1 -1
  32. package/dist/esm/record/recordExpressionEvaluator/nodeValueExtractor.js.map +1 -1
  33. package/dist/esm/record/recordExpressionEvaluator/recordExpressionEvaluator.js.map +1 -1
  34. package/dist/esm/record/recordFixer.js.map +1 -1
  35. package/dist/esm/record/recordNodesUpdater/recordEnumeratingItemsExpressionEvaluator.js.map +1 -1
  36. package/dist/esm/record/recordNodesUpdater/recordExpressionValueConverter.js.map +1 -1
  37. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsApplicableUpdater.js +1 -1
  38. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsApplicableUpdater.js.map +1 -1
  39. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsBooleanUpdater.js +1 -1
  40. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsBooleanUpdater.js.map +1 -1
  41. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsCodeAttributesUpdater.js.map +1 -1
  42. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsDefaultValuesUpdater.js.map +1 -1
  43. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEditableUpdater.js +1 -1
  44. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEditableUpdater.js.map +1 -1
  45. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.js.map +1 -1
  46. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.js.map +1 -1
  47. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsFileNamesEvaluator.js.map +1 -1
  48. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsUpdateParams.js.map +1 -1
  49. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsVisibleUpdater.js +1 -1
  50. package/dist/esm/record/recordNodesUpdater/recordNodeDependentsVisibleUpdater.js.map +1 -1
  51. package/dist/esm/record/recordNodesUpdater/recordNodesCreator.js.map +1 -1
  52. package/dist/esm/record/recordNodesUpdater/recordNodesDeleter.js +1 -1
  53. package/dist/esm/record/recordNodesUpdater/recordNodesDeleter.js.map +1 -1
  54. package/dist/esm/record/recordNodesUpdater/recordNodesDependentsUpdaterCommons.js.map +1 -1
  55. package/dist/esm/record/recordNodesUpdater/recordNodesUpdater.js.map +1 -1
  56. package/dist/esm/record/recordNodesUpdater/recordUpdateResult.js.map +1 -1
  57. package/dist/esm/record/recordPrettyPrinter.js.map +1 -1
  58. package/dist/esm/record/recordUpdater.js.map +1 -1
  59. package/dist/esm/record/recordValidator/attributeKeyValidator.js.map +1 -1
  60. package/dist/esm/record/recordValidator/attributeTypeValidator.js.map +1 -1
  61. package/dist/esm/record/recordValidator/attributeUniqueValidator.js.map +1 -1
  62. package/dist/esm/record/recordValidator/attributeValidator.js.map +1 -1
  63. package/dist/esm/record/recordValidator/countVaildator.js.map +1 -1
  64. package/dist/esm/record/recordValidator/recordValidator.js.map +1 -1
  65. package/dist/esm/record/service.js.map +1 -1
  66. package/dist/esm/survey/nodeDefsFixer.js.map +1 -1
  67. package/dist/esm/survey/surveys/_nodeDefs/nodeDefsIndex.js +2 -2
  68. package/dist/esm/survey/surveys/_nodeDefs/nodeDefsIndex.js.map +1 -1
  69. package/dist/esm/tests/builder/recordBuilder/attributeBuilder.js.map +1 -1
  70. package/dist/esm/tests/builder/recordBuilder/entityBuilder.js.map +1 -1
  71. package/dist/esm/tests/builder/recordBuilder/nodeBuilder.js.map +1 -1
  72. package/dist/esm/tests/builder/recordBuilder/recordBuilder.js.map +1 -1
  73. package/dist/esm/utils/index.js.map +1 -1
  74. package/dist/esm/utils/mutationOptions.js +5 -0
  75. package/dist/esm/utils/mutationOptions.js.map +1 -0
  76. package/dist/esm/validation/index.js.map +1 -1
  77. package/dist/esm/validation/validations.js +26 -19
  78. package/dist/esm/validation/validations.js.map +1 -1
  79. package/dist/index.d.ts +4 -4
  80. package/dist/index.js.map +1 -1
  81. package/dist/node/factory.d.ts +4 -4
  82. package/dist/node/factory.js.map +1 -1
  83. package/dist/node/index.d.ts +1 -2
  84. package/dist/node/index.js.map +1 -1
  85. package/dist/node/node.d.ts +7 -2
  86. package/dist/node/node.js.map +1 -1
  87. package/dist/node/nodePointer.d.ts +2 -2
  88. package/dist/node/nodePointer.js.map +1 -1
  89. package/dist/node/nodeValueFormatter.d.ts +2 -2
  90. package/dist/node/nodeValueFormatter.js.map +1 -1
  91. package/dist/node/nodeValues.d.ts +21 -21
  92. package/dist/node/nodeValues.js.map +1 -1
  93. package/dist/node/nodes.d.ts +38 -31
  94. package/dist/node/nodes.js +13 -5
  95. package/dist/node/nodes.js.map +1 -1
  96. package/dist/node/service.d.ts +6 -6
  97. package/dist/node/service.js.map +1 -1
  98. package/dist/nodeDefExpressionEvaluator/functions.js.map +1 -1
  99. package/dist/record/_records/recordCompletion.d.ts +9 -9
  100. package/dist/record/_records/recordCompletion.js.map +1 -1
  101. package/dist/record/_records/recordGetters.d.ts +69 -69
  102. package/dist/record/_records/recordGetters.js.map +1 -1
  103. package/dist/record/_records/recordNodesIndexUpdater.d.ts +13 -10
  104. package/dist/record/_records/recordNodesIndexUpdater.js +6 -4
  105. package/dist/record/_records/recordNodesIndexUpdater.js.map +1 -1
  106. package/dist/record/_records/recordPagesValidation.d.ts +11 -11
  107. package/dist/record/_records/recordPagesValidation.js.map +1 -1
  108. package/dist/record/_records/recordUpdateOptions.d.ts +2 -2
  109. package/dist/record/_records/recordUpdateOptions.js.map +1 -1
  110. package/dist/record/_records/recordUpdater.d.ts +5 -5
  111. package/dist/record/_records/recordUpdater.js +1 -1
  112. package/dist/record/_records/recordUpdater.js.map +1 -1
  113. package/dist/record/_records/recordUtils.d.ts +6 -6
  114. package/dist/record/_records/recordUtils.js.map +1 -1
  115. package/dist/record/factory.d.ts +2 -2
  116. package/dist/record/factory.js.map +1 -1
  117. package/dist/record/index.d.ts +1 -2
  118. package/dist/record/index.js.map +1 -1
  119. package/dist/record/nodePointers.d.ts +6 -6
  120. package/dist/record/nodePointers.js.map +1 -1
  121. package/dist/record/record.d.ts +8 -5
  122. package/dist/record/record.js.map +1 -1
  123. package/dist/record/recordCloner.d.ts +3 -3
  124. package/dist/record/recordCloner.js.map +1 -1
  125. package/dist/record/recordExpressionEvaluator/context.d.ts +6 -6
  126. package/dist/record/recordExpressionEvaluator/context.js.map +1 -1
  127. package/dist/record/recordExpressionEvaluator/node/identifier/identifier.js.map +1 -1
  128. package/dist/record/recordExpressionEvaluator/node/identifier/nodesFinder.d.ts +5 -5
  129. package/dist/record/recordExpressionEvaluator/node/identifier/nodesFinder.js.map +1 -1
  130. package/dist/record/recordExpressionEvaluator/nodeValueExtractor.d.ts +2 -2
  131. package/dist/record/recordExpressionEvaluator/nodeValueExtractor.js.map +1 -1
  132. package/dist/record/recordExpressionEvaluator/recordExpressionEvaluator.d.ts +4 -4
  133. package/dist/record/recordExpressionEvaluator/recordExpressionEvaluator.js.map +1 -1
  134. package/dist/record/recordFixer.js.map +1 -1
  135. package/dist/record/recordNodesUpdater/recordEnumeratingItemsExpressionEvaluator.d.ts +4 -4
  136. package/dist/record/recordNodesUpdater/recordEnumeratingItemsExpressionEvaluator.js.map +1 -1
  137. package/dist/record/recordNodesUpdater/recordExpressionValueConverter.d.ts +4 -4
  138. package/dist/record/recordNodesUpdater/recordExpressionValueConverter.js.map +1 -1
  139. package/dist/record/recordNodesUpdater/recordNodeDependentsApplicableUpdater.js +1 -1
  140. package/dist/record/recordNodesUpdater/recordNodeDependentsApplicableUpdater.js.map +1 -1
  141. package/dist/record/recordNodesUpdater/recordNodeDependentsBooleanUpdater.d.ts +4 -3
  142. package/dist/record/recordNodesUpdater/recordNodeDependentsBooleanUpdater.js +1 -1
  143. package/dist/record/recordNodesUpdater/recordNodeDependentsBooleanUpdater.js.map +1 -1
  144. package/dist/record/recordNodesUpdater/recordNodeDependentsCodeAttributesUpdater.js.map +1 -1
  145. package/dist/record/recordNodesUpdater/recordNodeDependentsDefaultValuesUpdater.js.map +1 -1
  146. package/dist/record/recordNodesUpdater/recordNodeDependentsEditableUpdater.js +1 -1
  147. package/dist/record/recordNodesUpdater/recordNodeDependentsEditableUpdater.js.map +1 -1
  148. package/dist/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.d.ts +2 -2
  149. package/dist/record/recordNodesUpdater/recordNodeDependentsEnumeratedEntitiesUpdater.js.map +1 -1
  150. package/dist/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.d.ts +2 -2
  151. package/dist/record/recordNodesUpdater/recordNodeDependentsEnumeratingItemsUpdater.js.map +1 -1
  152. package/dist/record/recordNodesUpdater/recordNodeDependentsFileNamesEvaluator.js.map +1 -1
  153. package/dist/record/recordNodesUpdater/recordNodeDependentsUpdateParams.d.ts +2 -2
  154. package/dist/record/recordNodesUpdater/recordNodeDependentsUpdateParams.js.map +1 -1
  155. package/dist/record/recordNodesUpdater/recordNodeDependentsVisibleUpdater.js +1 -1
  156. package/dist/record/recordNodesUpdater/recordNodeDependentsVisibleUpdater.js.map +1 -1
  157. package/dist/record/recordNodesUpdater/recordNodesCreator.d.ts +4 -4
  158. package/dist/record/recordNodesUpdater/recordNodesCreator.js.map +1 -1
  159. package/dist/record/recordNodesUpdater/recordNodesDeleter.d.ts +3 -3
  160. package/dist/record/recordNodesUpdater/recordNodesDeleter.js +1 -1
  161. package/dist/record/recordNodesUpdater/recordNodesDeleter.js.map +1 -1
  162. package/dist/record/recordNodesUpdater/recordNodesDependentsUpdaterCommons.d.ts +4 -4
  163. package/dist/record/recordNodesUpdater/recordNodesDependentsUpdaterCommons.js.map +1 -1
  164. package/dist/record/recordNodesUpdater/recordNodesUpdater.d.ts +2 -2
  165. package/dist/record/recordNodesUpdater/recordNodesUpdater.js.map +1 -1
  166. package/dist/record/recordNodesUpdater/recordUpdateResult.d.ts +6 -6
  167. package/dist/record/recordNodesUpdater/recordUpdateResult.js.map +1 -1
  168. package/dist/record/recordPrettyPrinter.d.ts +7 -7
  169. package/dist/record/recordPrettyPrinter.js.map +1 -1
  170. package/dist/record/recordUpdater.js.map +1 -1
  171. package/dist/record/recordValidator/attributeKeyValidator.d.ts +4 -4
  172. package/dist/record/recordValidator/attributeKeyValidator.js.map +1 -1
  173. package/dist/record/recordValidator/attributeTypeValidator.d.ts +4 -4
  174. package/dist/record/recordValidator/attributeTypeValidator.js.map +1 -1
  175. package/dist/record/recordValidator/attributeUniqueValidator.d.ts +4 -4
  176. package/dist/record/recordValidator/attributeUniqueValidator.js.map +1 -1
  177. package/dist/record/recordValidator/attributeValidator.d.ts +6 -6
  178. package/dist/record/recordValidator/attributeValidator.js.map +1 -1
  179. package/dist/record/recordValidator/countVaildator.d.ts +7 -7
  180. package/dist/record/recordValidator/countVaildator.js.map +1 -1
  181. package/dist/record/recordValidator/recordValidator.js.map +1 -1
  182. package/dist/record/records.d.ts +6 -6
  183. package/dist/record/service.d.ts +8 -8
  184. package/dist/record/service.js.map +1 -1
  185. package/dist/survey/nodeDefsFixer.d.ts +2 -2
  186. package/dist/survey/nodeDefsFixer.js.map +1 -1
  187. package/dist/survey/surveys/_nodeDefs/nodeDefsIndex.d.ts +3 -6
  188. package/dist/survey/surveys/_nodeDefs/nodeDefsIndex.js +2 -2
  189. package/dist/survey/surveys/_nodeDefs/nodeDefsIndex.js.map +1 -1
  190. package/dist/tests/builder/recordBuilder/attributeBuilder.d.ts +5 -5
  191. package/dist/tests/builder/recordBuilder/attributeBuilder.js.map +1 -1
  192. package/dist/tests/builder/recordBuilder/entityBuilder.d.ts +5 -5
  193. package/dist/tests/builder/recordBuilder/entityBuilder.js.map +1 -1
  194. package/dist/tests/builder/recordBuilder/nodeBuilder.d.ts +5 -5
  195. package/dist/tests/builder/recordBuilder/nodeBuilder.js.map +1 -1
  196. package/dist/tests/builder/recordBuilder/recordBuilder.d.ts +2 -2
  197. package/dist/tests/builder/recordBuilder/recordBuilder.js.map +1 -1
  198. package/dist/utils/index.d.ts +1 -0
  199. package/dist/utils/index.js.map +1 -1
  200. package/dist/utils/mutationOptions.d.ts +14 -0
  201. package/dist/utils/mutationOptions.js +9 -0
  202. package/dist/utils/mutationOptions.js.map +1 -0
  203. package/dist/validation/index.d.ts +1 -0
  204. package/dist/validation/index.js.map +1 -1
  205. package/dist/validation/validations.d.ts +17 -2
  206. package/dist/validation/validations.js +26 -19
  207. package/dist/validation/validations.js.map +1 -1
  208. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"recordCloner.js","sourceRoot":"","sources":["../../src/record/recordCloner.ts"],"names":[],"mappings":"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","sourcesContent":["import { Node, NodeValues, Nodes } from '../node'\nimport { NodeKeys, NodeMetaKeys } from '../node/node'\nimport { NodeDefCode, NodeDefType, NodeDefs } from '../nodeDef'\nimport { Survey, Surveys } from '../survey'\nimport { Dates, Objects, UUIDs } from '../utils'\nimport { Validation } from '../validation'\nimport { Record } from './record'\nimport { RecordFixer } from './recordFixer'\nimport { RecordUpdateResult } from './recordNodesUpdater'\nimport { RecordValidations } from './recordValidations'\nimport { Records } from './records'\n\ntype OldUuidToNewUuidMap = {\n [key: string]: string\n}\n\nconst assignNewUuidsToNodes = (params: {\n record: Record\n sideEffect: boolean\n}): { newNodeUuidsByOldUuid: OldUuidToNewUuidMap; newFileUuidsByOldUuid: OldUuidToNewUuidMap; record: Record } => {\n const { record, sideEffect } = params\n\n // generate a new uuid for each node\n const newNodeUuidsByOldUuid: OldUuidToNewUuidMap = {}\n const newFileUuidsByOldUuid: OldUuidToNewUuidMap = {}\n\n // sort nodes before removing the id, to preserve their hierarchy (faster than comparing each meta.h property)\n const nodesArray = Records.getNodesArray(record).sort(\n (nodeA: Node, nodeB: Node): number => Nodes.getHierarchy(nodeA).length - Nodes.getHierarchy(nodeB).length\n )\n\n const recordUpdated = sideEffect ? record : { ...record }\n\n const nodes = recordUpdated.nodes ?? {}\n const nodesUpdated = sideEffect ? nodes : { ...nodes }\n\n // update nodes recordUuid and properties (it does side effect on nodes)\n nodesArray.forEach((node) => {\n let nodeUpdated = sideEffect ? node : { ...node }\n nodeUpdated.recordUuid = record.uuid\n nodeUpdated.dateCreated = nodeUpdated.dateModified = Dates.nowFormattedForStorage()\n\n const oldUuid = node.uuid\n const newUuid = UUIDs.v4()\n newNodeUuidsByOldUuid[oldUuid] = newUuid\n\n nodeUpdated.uuid = newUuid\n // consider every node as just created node\n delete nodeUpdated.id\n nodeUpdated.created = true // this flag will be used by the RDB generator)\n\n // update internal node uuids, meta hierarchy, file uuid (if any)\n const parentUuid = node.parentUuid\n if (parentUuid) {\n nodeUpdated.parentUuid = newNodeUuidsByOldUuid[parentUuid]\n }\n const hierarchy = node.meta?.h ?? []\n if (hierarchy.length > 0) {\n const hierarchyUpdated = hierarchy.map((ancestorUuid) => newNodeUuidsByOldUuid[ancestorUuid])\n nodeUpdated = Objects.assocPath({\n obj: nodeUpdated,\n path: [NodeKeys.meta, NodeMetaKeys.h],\n value: hierarchyUpdated,\n sideEffect,\n })\n }\n // assign new file uuid (file should be cloned elsewhere)\n const fileUuid = NodeValues.getFileUuid(node)\n if (fileUuid) {\n const newFileUuid = UUIDs.v4()\n nodeUpdated = Objects.assocPath({\n obj: nodeUpdated,\n path: [NodeKeys.value, NodeValues.ValuePropsFile.fileUuid],\n value: newFileUuid,\n })\n newFileUuidsByOldUuid[fileUuid] = newFileUuid\n }\n\n delete nodesUpdated[oldUuid]\n nodesUpdated[newUuid] = nodeUpdated\n })\n\n recordUpdated.nodes = nodesUpdated\n\n return { newNodeUuidsByOldUuid, newFileUuidsByOldUuid, record: recordUpdated }\n}\n\nconst assignNewUuidsToValidation = (params: {\n validation: Validation\n newNodeUuidsByOldUuid: OldUuidToNewUuidMap\n sideEffect: boolean\n}): Validation => {\n const { validation, newNodeUuidsByOldUuid, sideEffect } = params\n\n const validationFields = validation?.fields\n if (!validationFields) return validation\n\n const validationFieldsUpdated = sideEffect ? validationFields : { ...validationFields }\n\n Object.entries(validationFields).forEach(([oldFieldKey, validationField]) => {\n let newFieldKey\n if (oldFieldKey.startsWith(RecordValidations.prefixValidationFieldChildrenCount)) {\n const oldParentUuid = oldFieldKey.substring(\n RecordValidations.prefixValidationFieldChildrenCount.length,\n oldFieldKey.lastIndexOf('_')\n )\n const newParentUuid = newNodeUuidsByOldUuid[oldParentUuid]\n newFieldKey = oldFieldKey.replace(oldParentUuid, newParentUuid)\n } else {\n newFieldKey = newNodeUuidsByOldUuid[oldFieldKey]\n }\n if (newFieldKey) {\n validationFieldsUpdated[newFieldKey] = validationField\n }\n delete validationFieldsUpdated[oldFieldKey]\n })\n return Objects.assoc({\n obj: validation,\n prop: 'fields',\n value: validationFieldsUpdated,\n sideEffect,\n })\n}\n\nconst assignNewUuids = (params: {\n record: Record\n sideEffect: boolean\n}): { newNodeUuidsByOldUuid: OldUuidToNewUuidMap; newFileUuidsByOldUuid: OldUuidToNewUuidMap; record: Record } => {\n const { record, sideEffect } = params\n let recordUpdated = sideEffect ? record : { ...record }\n recordUpdated.uuid = UUIDs.v4()\n\n const {\n newNodeUuidsByOldUuid,\n newFileUuidsByOldUuid,\n record: recordUpdatedUuids,\n } = assignNewUuidsToNodes({ record: recordUpdated, sideEffect })\n\n recordUpdated = recordUpdatedUuids\n\n const { validation } = recordUpdated\n if (validation) {\n const validationUpdated = assignNewUuidsToValidation({\n validation,\n newNodeUuidsByOldUuid,\n sideEffect,\n })\n recordUpdated = Objects.assoc({ obj: recordUpdated, prop: 'validation', value: validationUpdated, sideEffect })\n }\n // re-build nodes index\n const nodes = recordUpdated.nodes!\n delete recordUpdated._nodesIndex\n delete recordUpdated.nodes\n recordUpdated = Records.addNodes(nodes, { sideEffect, sortNodes: true })(recordUpdated)\n\n return { newNodeUuidsByOldUuid, newFileUuidsByOldUuid, record: recordUpdated }\n}\n\nconst removeExcludedNodes = (params: { survey: Survey; record: Record; sideEffect: boolean }): RecordUpdateResult => {\n const { survey, record, sideEffect } = params\n const cycle = record.cycle!\n const result = new RecordUpdateResult({ record })\n Surveys.visitDescendantsAndSelfNodeDef({\n survey,\n cycle,\n nodeDef: Surveys.getNodeDefRoot({ survey }),\n visitor: (nodeDef) => {\n const hasAncestorCodeDefExcludedInClone =\n nodeDef.type === NodeDefType.code &&\n Surveys.getNodeDefAncestorCodes({ survey, nodeDef: nodeDef as NodeDefCode }).some(NodeDefs.isExcludedInClone)\n\n if (\n !NodeDefs.isInCycle(cycle)(nodeDef) ||\n NodeDefs.isExcludedInClone(nodeDef) ||\n hasAncestorCodeDefExcludedInClone\n ) {\n const nodesToDelete = Records.getNodesByDefUuid(nodeDef.uuid)(result.record)\n if (nodesToDelete.length > 0) {\n const partialUpdateResult = Records.deleteNodes(\n nodesToDelete.map((node) => node.uuid),\n { sideEffect }\n )(result.record)\n result.merge(partialUpdateResult)\n }\n }\n },\n })\n return result\n}\n\nconst cloneRecord = (params: { survey: Survey; record: Record; cycleTo: string; sideEffect?: boolean }) => {\n const { survey, record, cycleTo, sideEffect = false } = params\n\n const recordUpdated = sideEffect ? record : { ...record }\n recordUpdated.cycle = cycleTo\n recordUpdated.dateCreated = recordUpdated.dateModified = Dates.nowFormattedForStorage()\n delete recordUpdated.id\n\n // delete nodes not included in clone\n const updateResult = new RecordUpdateResult({ record: recordUpdated })\n updateResult.merge(removeExcludedNodes({ survey, record: updateResult.record, sideEffect }))\n updateResult.merge(RecordFixer.insertMissingSingleNodes({ survey, record: updateResult.record, sideEffect }))\n\n // assign new UUIDs with side effect on record and nodes, faster when record is big\n const {\n newNodeUuidsByOldUuid,\n newFileUuidsByOldUuid,\n record: recordUpdatedUuids,\n } = assignNewUuids({ record: updateResult.record, sideEffect })\n\n updateResult.merge(new RecordUpdateResult({ record: recordUpdatedUuids }))\n\n return { record: updateResult.record, newNodeUuidsByOldUuid, newFileUuidsByOldUuid }\n}\n\nexport const RecordCloner = {\n cloneRecord,\n}\n"]}
1
+ {"version":3,"file":"recordCloner.js","sourceRoot":"","sources":["../../src/record/recordCloner.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArenaRecordNode, NodeValues, Nodes } from '../node'\nimport { NodeKeys, NodeMetaKeys } from '../node/node'\nimport { NodeDefCode, NodeDefType, NodeDefs } from '../nodeDef'\nimport { Survey, Surveys } from '../survey'\nimport { Dates, Objects, UUIDs } from '../utils'\nimport { Validation } from '../validation'\nimport { ArenaRecord } from './record'\nimport { RecordFixer } from './recordFixer'\nimport { RecordUpdateResult } from './recordNodesUpdater'\nimport { RecordValidations } from './recordValidations'\nimport { Records } from './records'\n\ntype OldUuidToNewUuidMap = {\n [key: string]: string\n}\n\nconst assignNewUuidsToNodes = (params: {\n record: ArenaRecord\n sideEffect: boolean\n}): { newNodeUuidsByOldUuid: OldUuidToNewUuidMap; newFileUuidsByOldUuid: OldUuidToNewUuidMap; record: ArenaRecord } => {\n const { record, sideEffect } = params\n\n // generate a new uuid for each node\n const newNodeUuidsByOldUuid: OldUuidToNewUuidMap = {}\n const newFileUuidsByOldUuid: OldUuidToNewUuidMap = {}\n\n // sort nodes before removing the id, to preserve their hierarchy (faster than comparing each meta.h property)\n const nodesArray = Records.getNodesArray(record).sort(\n (nodeA: ArenaRecordNode, nodeB: ArenaRecordNode): number =>\n Nodes.getHierarchy(nodeA).length - Nodes.getHierarchy(nodeB).length\n )\n\n const recordUpdated = sideEffect ? record : { ...record }\n\n const nodes = recordUpdated.nodes ?? {}\n const nodesUpdated = sideEffect ? nodes : { ...nodes }\n\n // update nodes recordUuid and properties (it does side effect on nodes)\n nodesArray.forEach((node) => {\n let nodeUpdated = sideEffect ? node : { ...node }\n nodeUpdated.recordUuid = record.uuid\n nodeUpdated.dateCreated = nodeUpdated.dateModified = Dates.nowFormattedForStorage()\n\n const oldUuid = node.uuid\n const newUuid = UUIDs.v4()\n newNodeUuidsByOldUuid[oldUuid] = newUuid\n\n nodeUpdated.uuid = newUuid\n // consider every node as just created node\n delete nodeUpdated.id\n nodeUpdated.created = true // this flag will be used by the RDB generator)\n\n // update internal node uuids, meta hierarchy, file uuid (if any)\n const parentUuid = node.parentUuid\n if (parentUuid) {\n nodeUpdated.parentUuid = newNodeUuidsByOldUuid[parentUuid]\n }\n const hierarchy = node.meta?.h ?? []\n if (hierarchy.length > 0) {\n const hierarchyUpdated = hierarchy.map((ancestorUuid) => newNodeUuidsByOldUuid[ancestorUuid])\n nodeUpdated = Objects.assocPath({\n obj: nodeUpdated,\n path: [NodeKeys.meta, NodeMetaKeys.h],\n value: hierarchyUpdated,\n sideEffect,\n })\n }\n // assign new file uuid (file should be cloned elsewhere)\n const fileUuid = NodeValues.getFileUuid(node)\n if (fileUuid) {\n const newFileUuid = UUIDs.v4()\n nodeUpdated = Objects.assocPath({\n obj: nodeUpdated,\n path: [NodeKeys.value, NodeValues.ValuePropsFile.fileUuid],\n value: newFileUuid,\n })\n newFileUuidsByOldUuid[fileUuid] = newFileUuid\n }\n\n delete nodesUpdated[oldUuid]\n nodesUpdated[newUuid] = nodeUpdated\n })\n\n recordUpdated.nodes = nodesUpdated\n\n return { newNodeUuidsByOldUuid, newFileUuidsByOldUuid, record: recordUpdated }\n}\n\nconst assignNewUuidsToValidation = (params: {\n validation: Validation\n newNodeUuidsByOldUuid: OldUuidToNewUuidMap\n sideEffect: boolean\n}): Validation => {\n const { validation, newNodeUuidsByOldUuid, sideEffect } = params\n\n const validationFields = validation?.fields\n if (!validationFields) return validation\n\n const validationFieldsUpdated = sideEffect ? validationFields : { ...validationFields }\n\n Object.entries(validationFields).forEach(([oldFieldKey, validationField]) => {\n let newFieldKey\n if (oldFieldKey.startsWith(RecordValidations.prefixValidationFieldChildrenCount)) {\n const oldParentUuid = oldFieldKey.substring(\n RecordValidations.prefixValidationFieldChildrenCount.length,\n oldFieldKey.lastIndexOf('_')\n )\n const newParentUuid = newNodeUuidsByOldUuid[oldParentUuid]\n newFieldKey = oldFieldKey.replace(oldParentUuid, newParentUuid)\n } else {\n newFieldKey = newNodeUuidsByOldUuid[oldFieldKey]\n }\n if (newFieldKey) {\n validationFieldsUpdated[newFieldKey] = validationField\n }\n delete validationFieldsUpdated[oldFieldKey]\n })\n return Objects.assoc({\n obj: validation,\n prop: 'fields',\n value: validationFieldsUpdated,\n sideEffect,\n })\n}\n\nconst assignNewUuids = (params: {\n record: ArenaRecord\n sideEffect: boolean\n}): { newNodeUuidsByOldUuid: OldUuidToNewUuidMap; newFileUuidsByOldUuid: OldUuidToNewUuidMap; record: ArenaRecord } => {\n const { record, sideEffect } = params\n let recordUpdated = sideEffect ? record : { ...record }\n recordUpdated.uuid = UUIDs.v4()\n\n const {\n newNodeUuidsByOldUuid,\n newFileUuidsByOldUuid,\n record: recordUpdatedUuids,\n } = assignNewUuidsToNodes({ record: recordUpdated, sideEffect })\n\n recordUpdated = recordUpdatedUuids\n\n const { validation } = recordUpdated\n if (validation) {\n const validationUpdated = assignNewUuidsToValidation({\n validation,\n newNodeUuidsByOldUuid,\n sideEffect,\n })\n recordUpdated = Objects.assoc({ obj: recordUpdated, prop: 'validation', value: validationUpdated, sideEffect })\n }\n // re-build nodes index\n const nodes = recordUpdated.nodes!\n delete recordUpdated._nodesIndex\n delete recordUpdated.nodes\n recordUpdated = Records.addNodes(nodes, { sideEffect, sortNodes: true })(recordUpdated)\n\n return { newNodeUuidsByOldUuid, newFileUuidsByOldUuid, record: recordUpdated }\n}\n\nconst removeExcludedNodes = (params: {\n survey: Survey\n record: ArenaRecord\n sideEffect: boolean\n}): RecordUpdateResult => {\n const { survey, record, sideEffect } = params\n const cycle = record.cycle!\n const result = new RecordUpdateResult({ record })\n Surveys.visitDescendantsAndSelfNodeDef({\n survey,\n cycle,\n nodeDef: Surveys.getNodeDefRoot({ survey }),\n visitor: (nodeDef) => {\n const hasAncestorCodeDefExcludedInClone =\n nodeDef.type === NodeDefType.code &&\n Surveys.getNodeDefAncestorCodes({ survey, nodeDef: nodeDef as NodeDefCode }).some(NodeDefs.isExcludedInClone)\n\n if (\n !NodeDefs.isInCycle(cycle)(nodeDef) ||\n NodeDefs.isExcludedInClone(nodeDef) ||\n hasAncestorCodeDefExcludedInClone\n ) {\n const nodesToDelete = Records.getNodesByDefUuid(nodeDef.uuid)(result.record)\n if (nodesToDelete.length > 0) {\n const partialUpdateResult = Records.deleteNodes(\n nodesToDelete.map((node) => node.uuid),\n { sideEffect }\n )(result.record)\n result.merge(partialUpdateResult)\n }\n }\n },\n })\n return result\n}\n\nconst cloneRecord = (params: { survey: Survey; record: ArenaRecord; cycleTo: string; sideEffect?: boolean }) => {\n const { survey, record, cycleTo, sideEffect = false } = params\n\n const recordUpdated = sideEffect ? record : { ...record }\n recordUpdated.cycle = cycleTo\n recordUpdated.dateCreated = recordUpdated.dateModified = Dates.nowFormattedForStorage()\n delete recordUpdated.id\n\n // delete nodes not included in clone\n const updateResult = new RecordUpdateResult({ record: recordUpdated })\n updateResult.merge(removeExcludedNodes({ survey, record: updateResult.record, sideEffect }))\n updateResult.merge(RecordFixer.insertMissingSingleNodes({ survey, record: updateResult.record, sideEffect }))\n\n // assign new UUIDs with side effect on record and nodes, faster when record is big\n const {\n newNodeUuidsByOldUuid,\n newFileUuidsByOldUuid,\n record: recordUpdatedUuids,\n } = assignNewUuids({ record: updateResult.record, sideEffect })\n\n updateResult.merge(new RecordUpdateResult({ record: recordUpdatedUuids }))\n\n return { record: updateResult.record, newNodeUuidsByOldUuid, newFileUuidsByOldUuid }\n}\n\nexport const RecordCloner = {\n cloneRecord,\n}\n"]}
@@ -1,17 +1,17 @@
1
1
  import { User } from '../../auth';
2
2
  import { ExpressionContext } from '../../expression';
3
- import { Node } from '../../node';
3
+ import { ArenaRecordNode } from '../../node';
4
4
  import { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider';
5
5
  import { TaxonProvider } from '../../nodeDefExpressionEvaluator/taxonProvider';
6
6
  import { Survey } from '../../survey';
7
- import { Record } from '../record';
7
+ import { ArenaRecord } from '../record';
8
8
  export interface RecordExpressionContext extends ExpressionContext {
9
9
  user: User;
10
10
  survey: Survey;
11
- record: Record;
12
- prevCycleRecord?: Record;
13
- nodeContext: Node;
14
- nodeCurrent?: Node;
11
+ record: ArenaRecord;
12
+ prevCycleRecord?: ArenaRecord;
13
+ nodeContext: ArenaRecordNode;
14
+ nodeCurrent?: ArenaRecordNode;
15
15
  item?: any;
16
16
  categoryItemProvider?: CategoryItemProvider;
17
17
  taxonProvider?: TaxonProvider;
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/record/recordExpressionEvaluator/context.ts"],"names":[],"mappings":"","sourcesContent":["import { User } from '../../auth'\nimport { ExpressionContext } from '../../expression'\nimport { Node } from '../../node'\nimport { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider'\nimport { TaxonProvider } from '../../nodeDefExpressionEvaluator/taxonProvider'\nimport { Survey } from '../../survey'\nimport { Record } from '../record'\n\nexport interface RecordExpressionContext extends ExpressionContext {\n user: User\n survey: Survey\n record: Record\n prevCycleRecord?: Record\n nodeContext: Node\n nodeCurrent?: Node\n item?: any\n categoryItemProvider?: CategoryItemProvider\n taxonProvider?: TaxonProvider\n}\n"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/record/recordExpressionEvaluator/context.ts"],"names":[],"mappings":"","sourcesContent":["import { User } from '../../auth'\nimport { ExpressionContext } from '../../expression'\nimport { ArenaRecordNode } from '../../node'\nimport { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider'\nimport { TaxonProvider } from '../../nodeDefExpressionEvaluator/taxonProvider'\nimport { Survey } from '../../survey'\nimport { ArenaRecord } from '../record'\n\nexport interface RecordExpressionContext extends ExpressionContext {\n user: User\n survey: Survey\n record: ArenaRecord\n prevCycleRecord?: ArenaRecord\n nodeContext: ArenaRecordNode\n nodeCurrent?: ArenaRecordNode\n item?: any\n categoryItemProvider?: CategoryItemProvider\n taxonProvider?: TaxonProvider\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"identifier.js","sourceRoot":"","sources":["../../../../../src/record/recordExpressionEvaluator/node/identifier/identifier.ts"],"names":[],"mappings":"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","sourcesContent":["import { ExpressionVariable, IdentifierExpression } from '../../../../expression'\nimport { IdentifierEvaluator } from '../../../../expression/javascript/node/identifier'\nimport { Node } from '../../../../node'\nimport { NodeDef, NodeDefs, NodeDefType } from '../../../../nodeDef'\nimport { Records } from '../../../records'\nimport { NodeValues } from '../../../../node/nodeValues'\nimport { Survey, Surveys } from '../../../../survey'\nimport { RecordExpressionContext } from '../../context'\nimport { NodesFinder } from './nodesFinder'\nimport { SystemError } from '../../../../error'\nimport { NodeValueExtractor } from '../../nodeValueExtractor'\nimport { Record } from '../../../record'\n\nconst getNodesOrValues = (params: {\n survey: Survey\n referencedNodes: Node[]\n nodeDefReferenced: NodeDef<any>\n propName: string\n evaluateToNode?: boolean\n}): any[] => {\n const { survey, nodeDefReferenced, referencedNodes, propName, evaluateToNode } = params\n const single = !nodeDefReferenced.props.multiple\n if (single) {\n if (referencedNodes.length === 0) {\n // do not throw error if node is missing, consider its value as null\n // throw new SystemError('expression.nodeNotFoundForNodeDef', { nodeDefName: propName })\n return []\n }\n if (referencedNodes.length > 1)\n throw new SystemError('expression.multipleNodesFoundForNodeDef', { nodeDefName: propName })\n }\n if (nodeDefReferenced.type === NodeDefType.entity || evaluateToNode) {\n // return nodes\n return referencedNodes\n }\n // return node values\n return referencedNodes.map((referencedNode) =>\n NodeValueExtractor.getNodeValue({ survey, node: referencedNode, nodeDef: nodeDefReferenced })\n )\n}\n\nconst evaluateIdentifierOnNode = (params: {\n survey: Survey\n record: Record\n nodeObject: Node\n evaluateToNode?: boolean\n propName: string\n}) => {\n const { survey, record, nodeObject, evaluateToNode = false, propName } = params\n const { nodeDefUuid: nodeDefObjectUuid, value } = nodeObject\n if (!nodeDefObjectUuid) {\n throw new SystemError('expression.identifierNotFound', { name: propName })\n }\n\n const nodeDefObject = Surveys.getNodeDefByUuid({ survey, uuid: nodeDefObjectUuid })\n\n // node value prop (native)\n const valueProp = value?.[propName]\n if (valueProp !== undefined) {\n return valueProp\n }\n if (NodeDefs.isAttribute(nodeDefObject)) {\n // node value prop (Arena specific value property)\n if (NodeValues.isValueProp({ nodeDef: nodeDefObject, prop: propName })) {\n return NodeValues.getNodeValueProp({ nodeDef: nodeDefObject, node: nodeObject, prop: propName })\n } else {\n throw new SystemError('expression.invalidAttributeValuePropertyName', {\n attributeName: NodeDefs.getName(nodeDefObject),\n propName,\n })\n }\n }\n\n const nodeDefReferenced = Surveys.findNodeDefByName({ survey, name: propName })\n\n if (!nodeDefReferenced) {\n throw new SystemError('expression.identifierNotFound', { name: propName })\n }\n\n if (nodeObject.nodeDefUuid === nodeDefReferenced.uuid) {\n // the referenced node is the current node itself\n return nodeObject\n }\n if (Surveys.isNodeDefAncestor({ nodeDefAncestor: nodeDefReferenced, nodeDefDescendant: nodeDefObject })) {\n return Records.getAncestor({ record, node: nodeObject, ancestorDefUuid: nodeDefReferenced.uuid })\n }\n // the referenced nodes can be siblings of the current node\n const referencedNodes = NodesFinder.findDescendants({ survey, record, nodeContext: nodeObject, nodeDefReferenced })\n const nodesOrValues = getNodesOrValues({ survey, referencedNodes, nodeDefReferenced, propName, evaluateToNode })\n return nodeDefReferenced.props.multiple ? nodesOrValues : nodesOrValues[0]\n}\n\nexport class RecordIdentifierEvaluator extends IdentifierEvaluator<RecordExpressionContext> {\n evaluate(expressionNode: IdentifierExpression): Promise<any> {\n return Promise.resolve(this.evaluateValue(expressionNode))\n }\n\n private evaluateValue(expressionNode: IdentifierExpression): any {\n const { name: propName } = expressionNode\n\n if (propName === ExpressionVariable.CONTEXT) {\n return this.context.nodeContext\n }\n\n // try to find identifier among global or native properties\n // (not-found is signaled without throwing; the try/catch only handles the rare case of an unknown member of a global object)\n try {\n const property = this.findGlobalOrNativeProperty(expressionNode)\n if (property) {\n return property.value\n }\n } catch {\n // ignore it\n }\n\n // identifier not found among global or native properties\n // identifier should be a node or a node value property\n const { survey, record, evaluateToNode, object: contextObject, item } = this.context\n\n if (item && item === contextObject) {\n // evaluating category or taxon item prop or extra prop\n return item.props?.[propName] ?? item.props?.extra?.[propName]\n }\n\n if (Array.isArray(contextObject)) {\n return contextObject.flatMap((contextNode) => {\n const evaluationResult = evaluateIdentifierOnNode({\n survey,\n record,\n nodeObject: contextNode,\n evaluateToNode,\n propName,\n })\n return Array.isArray(evaluationResult) ? evaluationResult : [evaluationResult]\n })\n }\n return evaluateIdentifierOnNode({ survey, record, nodeObject: contextObject, evaluateToNode, propName })\n }\n}\n"]}
1
+ {"version":3,"file":"identifier.js","sourceRoot":"","sources":["../../../../../src/record/recordExpressionEvaluator/node/identifier/identifier.ts"],"names":[],"mappings":"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","sourcesContent":["import { ExpressionVariable, IdentifierExpression } from '../../../../expression'\nimport { IdentifierEvaluator } from '../../../../expression/javascript/node/identifier'\nimport { ArenaRecordNode } from '../../../../node'\nimport { NodeDef, NodeDefs, NodeDefType } from '../../../../nodeDef'\nimport { Records } from '../../../records'\nimport { NodeValues } from '../../../../node/nodeValues'\nimport { Survey, Surveys } from '../../../../survey'\nimport { RecordExpressionContext } from '../../context'\nimport { NodesFinder } from './nodesFinder'\nimport { SystemError } from '../../../../error'\nimport { NodeValueExtractor } from '../../nodeValueExtractor'\nimport { ArenaRecord } from '../../../record'\n\nconst getNodesOrValues = (params: {\n survey: Survey\n referencedNodes: ArenaRecordNode[]\n nodeDefReferenced: NodeDef<any>\n propName: string\n evaluateToNode?: boolean\n}): any[] => {\n const { survey, nodeDefReferenced, referencedNodes, propName, evaluateToNode } = params\n const single = !nodeDefReferenced.props.multiple\n if (single) {\n if (referencedNodes.length === 0) {\n // do not throw error if node is missing, consider its value as null\n // throw new SystemError('expression.nodeNotFoundForNodeDef', { nodeDefName: propName })\n return []\n }\n if (referencedNodes.length > 1)\n throw new SystemError('expression.multipleNodesFoundForNodeDef', { nodeDefName: propName })\n }\n if (nodeDefReferenced.type === NodeDefType.entity || evaluateToNode) {\n // return nodes\n return referencedNodes\n }\n // return node values\n return referencedNodes.map((referencedNode) =>\n NodeValueExtractor.getNodeValue({ survey, node: referencedNode, nodeDef: nodeDefReferenced })\n )\n}\n\nconst evaluateIdentifierOnNode = (params: {\n survey: Survey\n record: ArenaRecord\n nodeObject: ArenaRecordNode\n evaluateToNode?: boolean\n propName: string\n}) => {\n const { survey, record, nodeObject, evaluateToNode = false, propName } = params\n const { nodeDefUuid: nodeDefObjectUuid, value } = nodeObject\n if (!nodeDefObjectUuid) {\n throw new SystemError('expression.identifierNotFound', { name: propName })\n }\n\n const nodeDefObject = Surveys.getNodeDefByUuid({ survey, uuid: nodeDefObjectUuid })\n\n // node value prop (native)\n const valueProp = value?.[propName]\n if (valueProp !== undefined) {\n return valueProp\n }\n if (NodeDefs.isAttribute(nodeDefObject)) {\n // node value prop (Arena specific value property)\n if (NodeValues.isValueProp({ nodeDef: nodeDefObject, prop: propName })) {\n return NodeValues.getNodeValueProp({ nodeDef: nodeDefObject, node: nodeObject, prop: propName })\n } else {\n throw new SystemError('expression.invalidAttributeValuePropertyName', {\n attributeName: NodeDefs.getName(nodeDefObject),\n propName,\n })\n }\n }\n\n const nodeDefReferenced = Surveys.findNodeDefByName({ survey, name: propName })\n\n if (!nodeDefReferenced) {\n throw new SystemError('expression.identifierNotFound', { name: propName })\n }\n\n if (nodeObject.nodeDefUuid === nodeDefReferenced.uuid) {\n // the referenced node is the current node itself\n return nodeObject\n }\n if (Surveys.isNodeDefAncestor({ nodeDefAncestor: nodeDefReferenced, nodeDefDescendant: nodeDefObject })) {\n return Records.getAncestor({ record, node: nodeObject, ancestorDefUuid: nodeDefReferenced.uuid })\n }\n // the referenced nodes can be siblings of the current node\n const referencedNodes = NodesFinder.findDescendants({ survey, record, nodeContext: nodeObject, nodeDefReferenced })\n const nodesOrValues = getNodesOrValues({ survey, referencedNodes, nodeDefReferenced, propName, evaluateToNode })\n return nodeDefReferenced.props.multiple ? nodesOrValues : nodesOrValues[0]\n}\n\nexport class RecordIdentifierEvaluator extends IdentifierEvaluator<RecordExpressionContext> {\n evaluate(expressionNode: IdentifierExpression): Promise<any> {\n return Promise.resolve(this.evaluateValue(expressionNode))\n }\n\n private evaluateValue(expressionNode: IdentifierExpression): any {\n const { name: propName } = expressionNode\n\n if (propName === ExpressionVariable.CONTEXT) {\n return this.context.nodeContext\n }\n\n // try to find identifier among global or native properties\n // (not-found is signaled without throwing; the try/catch only handles the rare case of an unknown member of a global object)\n try {\n const property = this.findGlobalOrNativeProperty(expressionNode)\n if (property) {\n return property.value\n }\n } catch {\n // ignore it\n }\n\n // identifier not found among global or native properties\n // identifier should be a node or a node value property\n const { survey, record, evaluateToNode, object: contextObject, item } = this.context\n\n if (item && item === contextObject) {\n // evaluating category or taxon item prop or extra prop\n return item.props?.[propName] ?? item.props?.extra?.[propName]\n }\n\n if (Array.isArray(contextObject)) {\n return contextObject.flatMap((contextNode) => {\n const evaluationResult = evaluateIdentifierOnNode({\n survey,\n record,\n nodeObject: contextNode,\n evaluateToNode,\n propName,\n })\n return Array.isArray(evaluationResult) ? evaluationResult : [evaluationResult]\n })\n }\n return evaluateIdentifierOnNode({ survey, record, nodeObject: contextObject, evaluateToNode, propName })\n }\n}\n"]}
@@ -1,13 +1,13 @@
1
- import { Node } from '../../../../node';
1
+ import { ArenaRecordNode } from '../../../../node';
2
2
  import { NodeDef } from '../../../../nodeDef';
3
- import { Record } from '../../../record';
3
+ import { ArenaRecord } from '../../../record';
4
4
  import { Survey } from '../../../../survey';
5
5
  declare const findDescendants: (params: {
6
6
  survey: Survey;
7
- record: Record;
8
- nodeContext: Node;
7
+ record: ArenaRecord;
8
+ nodeContext: ArenaRecordNode;
9
9
  nodeDefReferenced: NodeDef<any>;
10
- }) => Node[];
10
+ }) => ArenaRecordNode[];
11
11
  export declare const NodesFinder: {
12
12
  findDescendants: typeof findDescendants;
13
13
  };
@@ -1 +1 @@
1
- {"version":3,"file":"nodesFinder.js","sourceRoot":"","sources":["../../../../../src/record/recordExpressionEvaluator/node/identifier/nodesFinder.ts"],"names":[],"mappings":"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","sourcesContent":["import { Node, Nodes } from '../../../../node'\nimport { NodeDef, NodeDefType } from '../../../../nodeDef'\nimport { Record } from '../../../record'\nimport { Records } from '../../../records'\nimport { Survey, Surveys } from '../../../../survey'\nimport { Arrays } from '../../../../utils'\n\nconst getCommonAncestor = (params: {\n record: Record\n nodeCtxHierarchy: string[]\n nodeDefCtx: NodeDef<any>\n nodeDefReferenced: NodeDef<any>\n}): Node | undefined => {\n const { record, nodeCtxHierarchy, nodeDefCtx, nodeDefReferenced } = params\n if (!nodeDefCtx.parentUuid) {\n return Records.getRoot(record)\n }\n const nodeDefReferencedH = nodeDefReferenced.meta.h\n // meta.h contains only ancestors (excluding the node itself); include nodeDefCtx.uuid so that\n // the context nodeDef can be treated as the common ancestor when nodeDefReferenced is a descendant of nodeDefCtx\n const nodeDefCtxHierarchyToConsider = [...nodeDefCtx.meta.h, nodeDefCtx.uuid]\n const nodeDefCommonH = Arrays.intersection(nodeDefReferencedH, nodeDefCtxHierarchyToConsider)\n if (nodeDefCommonH.length === 1) {\n return Records.getRoot(record)\n }\n if (nodeDefCommonH.length > 1) {\n const nodeCommonAncestorUuid = nodeCtxHierarchy[nodeDefCommonH.length - 1]\n return record.nodes?.[nodeCommonAncestorUuid]\n }\n return undefined\n}\n\nconst getReferencedNodesParent = (params: {\n survey: Survey\n record: Record\n nodeContext: Node\n nodeDefReferenced: NodeDef<any>\n}): Node | undefined => {\n const { survey, record, nodeContext, nodeDefReferenced } = params\n\n // Referenced node is a child of the context node\n if (nodeDefReferenced.parentUuid === nodeContext.nodeDefUuid) {\n return nodeContext\n }\n\n const nodeDefCtx = Surveys.getNodeDefByUuid({ survey, uuid: nodeContext.nodeDefUuid })\n\n const nodeCtxH = Nodes.getHierarchy(nodeContext)\n if (nodeDefCtx.type === NodeDefType.entity) {\n // When nodeDefCtx is entity, expression is type applicableIf (and context always starts from parent)\n nodeCtxH.push(nodeContext.uuid)\n }\n\n if (Surveys.isNodeDefAncestor({ nodeDefAncestor: nodeDefReferenced, nodeDefDescendant: nodeDefCtx })) {\n const nodeDefReferencedH = nodeDefReferenced.meta.h\n const nodeReferencedParentUuid = nodeCtxH[nodeDefReferencedH.length - 1]\n const nodeReferencedParent = record.nodes?.[nodeReferencedParentUuid]\n if (!nodeReferencedParent) {\n throw new Error(`Cannot find parent node of ${nodeDefReferenced.props.name} from ${nodeDefCtx.props.name}`)\n }\n return nodeReferencedParent\n }\n\n const nodeCommonAncestor = getCommonAncestor({\n record,\n nodeCtxHierarchy: nodeCtxH,\n nodeDefCtx,\n nodeDefReferenced,\n })\n if (!nodeCommonAncestor) return undefined\n\n const nodeDefReferencedParent = Surveys.getNodeDefParent({ survey, nodeDef: nodeDefReferenced })\n if (!nodeDefReferencedParent) return undefined\n\n return Records.getDescendant({ record, node: nodeCommonAncestor, nodeDefDescendant: nodeDefReferencedParent })\n}\n\n// Get reachable nodes, i.e. the children of the node's ancestors.\n// NOTE: The root node is excluded, but it _should_ be an entity, so that is fine.\nconst findDescendants = (params: {\n survey: Survey\n record: Record\n nodeContext: Node\n nodeDefReferenced: NodeDef<any>\n}): Node[] => {\n const { survey, record, nodeContext, nodeDefReferenced } = params\n const nodeReferencedParent = getReferencedNodesParent({ survey, record, nodeContext, nodeDefReferenced })\n\n if (nodeReferencedParent) {\n return Records.getChildren(nodeReferencedParent, nodeDefReferenced.uuid)(record)\n }\n return []\n}\n\nexport const NodesFinder = {\n findDescendants,\n}\n"]}
1
+ {"version":3,"file":"nodesFinder.js","sourceRoot":"","sources":["../../../../../src/record/recordExpressionEvaluator/node/identifier/nodesFinder.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArenaRecordNode, Nodes } from '../../../../node'\nimport { NodeDef, NodeDefType } from '../../../../nodeDef'\nimport { ArenaRecord } from '../../../record'\nimport { Records } from '../../../records'\nimport { Survey, Surveys } from '../../../../survey'\nimport { Arrays } from '../../../../utils'\n\nconst getCommonAncestor = (params: {\n record: ArenaRecord\n nodeCtxHierarchy: string[]\n nodeDefCtx: NodeDef<any>\n nodeDefReferenced: NodeDef<any>\n}): ArenaRecordNode | undefined => {\n const { record, nodeCtxHierarchy, nodeDefCtx, nodeDefReferenced } = params\n if (!nodeDefCtx.parentUuid) {\n return Records.getRoot(record)\n }\n const nodeDefReferencedH = nodeDefReferenced.meta.h\n // meta.h contains only ancestors (excluding the node itself); include nodeDefCtx.uuid so that\n // the context nodeDef can be treated as the common ancestor when nodeDefReferenced is a descendant of nodeDefCtx\n const nodeDefCtxHierarchyToConsider = [...nodeDefCtx.meta.h, nodeDefCtx.uuid]\n const nodeDefCommonH = Arrays.intersection(nodeDefReferencedH, nodeDefCtxHierarchyToConsider)\n if (nodeDefCommonH.length === 1) {\n return Records.getRoot(record)\n }\n if (nodeDefCommonH.length > 1) {\n const nodeCommonAncestorUuid = nodeCtxHierarchy[nodeDefCommonH.length - 1]\n return record.nodes?.[nodeCommonAncestorUuid]\n }\n return undefined\n}\n\nconst getReferencedNodesParent = (params: {\n survey: Survey\n record: ArenaRecord\n nodeContext: ArenaRecordNode\n nodeDefReferenced: NodeDef<any>\n}): ArenaRecordNode | undefined => {\n const { survey, record, nodeContext, nodeDefReferenced } = params\n\n // Referenced node is a child of the context node\n if (nodeDefReferenced.parentUuid === nodeContext.nodeDefUuid) {\n return nodeContext\n }\n\n const nodeDefCtx = Surveys.getNodeDefByUuid({ survey, uuid: nodeContext.nodeDefUuid })\n\n const nodeCtxH = Nodes.getHierarchy(nodeContext)\n if (nodeDefCtx.type === NodeDefType.entity) {\n // When nodeDefCtx is entity, expression is type applicableIf (and context always starts from parent)\n nodeCtxH.push(nodeContext.uuid)\n }\n\n if (Surveys.isNodeDefAncestor({ nodeDefAncestor: nodeDefReferenced, nodeDefDescendant: nodeDefCtx })) {\n const nodeDefReferencedH = nodeDefReferenced.meta.h\n const nodeReferencedParentUuid = nodeCtxH[nodeDefReferencedH.length - 1]\n const nodeReferencedParent = record.nodes?.[nodeReferencedParentUuid]\n if (!nodeReferencedParent) {\n throw new Error(`Cannot find parent node of ${nodeDefReferenced.props.name} from ${nodeDefCtx.props.name}`)\n }\n return nodeReferencedParent\n }\n\n const nodeCommonAncestor = getCommonAncestor({\n record,\n nodeCtxHierarchy: nodeCtxH,\n nodeDefCtx,\n nodeDefReferenced,\n })\n if (!nodeCommonAncestor) return undefined\n\n const nodeDefReferencedParent = Surveys.getNodeDefParent({ survey, nodeDef: nodeDefReferenced })\n if (!nodeDefReferencedParent) return undefined\n\n return Records.getDescendant({ record, node: nodeCommonAncestor, nodeDefDescendant: nodeDefReferencedParent })\n}\n\n// Get reachable nodes, i.e. the children of the node's ancestors.\n// NOTE: The root node is excluded, but it _should_ be an entity, so that is fine.\nconst findDescendants = (params: {\n survey: Survey\n record: ArenaRecord\n nodeContext: ArenaRecordNode\n nodeDefReferenced: NodeDef<any>\n}): ArenaRecordNode[] => {\n const { survey, record, nodeContext, nodeDefReferenced } = params\n const nodeReferencedParent = getReferencedNodesParent({ survey, record, nodeContext, nodeDefReferenced })\n\n if (nodeReferencedParent) {\n return Records.getChildren(nodeReferencedParent, nodeDefReferenced.uuid)(record)\n }\n return []\n}\n\nexport const NodesFinder = {\n findDescendants,\n}\n"]}
@@ -1,9 +1,9 @@
1
1
  import { Survey } from '../../survey';
2
2
  import { NodeDef } from '../../nodeDef';
3
- import { Node } from '../../node';
3
+ import { ArenaRecordNode } from '../../node';
4
4
  declare const getNodeValue: (params: {
5
5
  survey: Survey;
6
- node: Node;
6
+ node: ArenaRecordNode;
7
7
  nodeDef: NodeDef<any>;
8
8
  }) => any;
9
9
  export declare const NodeValueExtractor: {
@@ -1 +1 @@
1
- {"version":3,"file":"nodeValueExtractor.js","sourceRoot":"","sources":["../../../src/record/recordExpressionEvaluator/nodeValueExtractor.ts"],"names":[],"mappings":"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","sourcesContent":["import { Survey, Surveys } from '../../survey'\nimport { NodeDef, NodeDefType } from '../../nodeDef'\nimport { Node } from '../../node'\nimport { NodeValues } from '../../node/nodeValues'\nimport { Dates, Objects } from '../../utils'\nimport { CategoryItem } from '../../category'\nimport { Taxon } from '../../taxonomy'\n\ninterface ExtractorParams {\n survey: Survey\n node: Node\n}\n\ntype Extractor = (params: ExtractorParams) => any\n\nconst extractCategoryItem = (params: ExtractorParams): CategoryItem | undefined => {\n const { survey, node } = params\n const item = node.refData?.categoryItem\n if (item) return item\n const itemUuid = NodeValues.getItemUuid(node)\n return itemUuid ? Surveys.getCategoryItemByUuid({ survey, itemUuid }) : undefined\n}\n\nconst extractTaxon = (params: ExtractorParams): Taxon | undefined => {\n const { survey, node } = params\n const taxon = node.refData?.taxon\n if (taxon) return taxon\n const taxonUuid = NodeValues.getTaxonUuid(node)\n return taxonUuid ? Surveys.getTaxonByUuid({ survey, taxonUuid }) : undefined\n}\n\nconst extractorsByNodeDefType: { [key in NodeDefType]?: Extractor } = {\n [NodeDefType.boolean]: (params: ExtractorParams) => {\n const { node } = params\n return node.value === 'true'\n },\n [NodeDefType.code]: (params: ExtractorParams) => {\n const item = extractCategoryItem(params)\n return item ? item.props.code : null\n },\n [NodeDefType.coordinate]: (params: ExtractorParams) => params.node.value,\n [NodeDefType.date]: (params: ExtractorParams) => {\n const { node } = params\n const [year, month, day] = [\n NodeValues.getDateYear(node),\n NodeValues.getDateMonth(node),\n NodeValues.getDateDay(node),\n ]\n if (Dates.isValidDate(year, month, day)) {\n return node.value\n }\n return null\n },\n [NodeDefType.decimal]: (params: ExtractorParams) => {\n const { node } = params\n return Number(node.value)\n },\n [NodeDefType.entity]: (_params: ExtractorParams) => null,\n [NodeDefType.file]: (params: ExtractorParams) => params.node.value,\n [NodeDefType.integer]: (params: ExtractorParams) => {\n const { node } = params\n return Number(node.value)\n },\n [NodeDefType.taxon]: (params: ExtractorParams) => {\n const taxon = extractTaxon(params)\n return taxon ? taxon.props.code : null\n },\n [NodeDefType.text]: (params: ExtractorParams) => params.node.value,\n [NodeDefType.time]: (params: ExtractorParams) => {\n const { node } = params\n const [hour, minute, seconds] = [\n NodeValues.getTimeHour(node),\n NodeValues.getTimeMinute(node),\n NodeValues.getTimeSeconds(node),\n ]\n if (Dates.isValidTime(hour, minute, seconds)) {\n return node.value\n }\n return null\n },\n}\n\nconst getNodeValue = (params: { survey: Survey; node: Node; nodeDef: NodeDef<any> }) => {\n const { node, nodeDef, survey } = params\n\n if (Objects.isEmpty(node.value)) {\n return null\n }\n const extractor = extractorsByNodeDefType[nodeDef.type as NodeDefType]\n return extractor?.({ survey, node })\n}\n\nexport const NodeValueExtractor = {\n getNodeValue,\n}\n"]}
1
+ {"version":3,"file":"nodeValueExtractor.js","sourceRoot":"","sources":["../../../src/record/recordExpressionEvaluator/nodeValueExtractor.ts"],"names":[],"mappings":"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","sourcesContent":["import { Survey, Surveys } from '../../survey'\nimport { NodeDef, NodeDefType } from '../../nodeDef'\nimport { ArenaRecordNode } from '../../node'\nimport { NodeValues } from '../../node/nodeValues'\nimport { Dates, Objects } from '../../utils'\nimport { CategoryItem } from '../../category'\nimport { Taxon } from '../../taxonomy'\n\ninterface ExtractorParams {\n survey: Survey\n node: ArenaRecordNode\n}\n\ntype Extractor = (params: ExtractorParams) => any\n\nconst extractCategoryItem = (params: ExtractorParams): CategoryItem | undefined => {\n const { survey, node } = params\n const item = node.refData?.categoryItem\n if (item) return item\n const itemUuid = NodeValues.getItemUuid(node)\n return itemUuid ? Surveys.getCategoryItemByUuid({ survey, itemUuid }) : undefined\n}\n\nconst extractTaxon = (params: ExtractorParams): Taxon | undefined => {\n const { survey, node } = params\n const taxon = node.refData?.taxon\n if (taxon) return taxon\n const taxonUuid = NodeValues.getTaxonUuid(node)\n return taxonUuid ? Surveys.getTaxonByUuid({ survey, taxonUuid }) : undefined\n}\n\nconst extractorsByNodeDefType: { [key in NodeDefType]?: Extractor } = {\n [NodeDefType.boolean]: (params: ExtractorParams) => {\n const { node } = params\n return node.value === 'true'\n },\n [NodeDefType.code]: (params: ExtractorParams) => {\n const item = extractCategoryItem(params)\n return item ? item.props.code : null\n },\n [NodeDefType.coordinate]: (params: ExtractorParams) => params.node.value,\n [NodeDefType.date]: (params: ExtractorParams) => {\n const { node } = params\n const [year, month, day] = [\n NodeValues.getDateYear(node),\n NodeValues.getDateMonth(node),\n NodeValues.getDateDay(node),\n ]\n if (Dates.isValidDate(year, month, day)) {\n return node.value\n }\n return null\n },\n [NodeDefType.decimal]: (params: ExtractorParams) => {\n const { node } = params\n return Number(node.value)\n },\n [NodeDefType.entity]: (_params: ExtractorParams) => null,\n [NodeDefType.file]: (params: ExtractorParams) => params.node.value,\n [NodeDefType.integer]: (params: ExtractorParams) => {\n const { node } = params\n return Number(node.value)\n },\n [NodeDefType.taxon]: (params: ExtractorParams) => {\n const taxon = extractTaxon(params)\n return taxon ? taxon.props.code : null\n },\n [NodeDefType.text]: (params: ExtractorParams) => params.node.value,\n [NodeDefType.time]: (params: ExtractorParams) => {\n const { node } = params\n const [hour, minute, seconds] = [\n NodeValues.getTimeHour(node),\n NodeValues.getTimeMinute(node),\n NodeValues.getTimeSeconds(node),\n ]\n if (Dates.isValidTime(hour, minute, seconds)) {\n return node.value\n }\n return null\n },\n}\n\nconst getNodeValue = (params: { survey: Survey; node: ArenaRecordNode; nodeDef: NodeDef<any> }) => {\n const { node, nodeDef, survey } = params\n\n if (Objects.isEmpty(node.value)) {\n return null\n }\n const extractor = extractorsByNodeDefType[nodeDef.type as NodeDefType]\n return extractor?.({ survey, node })\n}\n\nexport const NodeValueExtractor = {\n getNodeValue,\n}\n"]}
@@ -3,7 +3,7 @@ import { User } from '../../auth';
3
3
  import { CategoryItem } from '../../category';
4
4
  import { JavascriptExpressionEvaluator } from '../../expression';
5
5
  import { LanguageCode } from '../../language';
6
- import { Node } from '../../node';
6
+ import { ArenaRecordNode } from '../../node';
7
7
  import { NodeDefExpression } from '../../nodeDef';
8
8
  import { Survey } from '../../survey';
9
9
  import { Taxon } from '../../taxonomy';
@@ -19,13 +19,13 @@ type ExpressionEvaluateParams = {
19
19
  export declare class RecordExpressionEvaluator extends JavascriptExpressionEvaluator<RecordExpressionContext> {
20
20
  constructor();
21
21
  evalExpression(params: ExpressionEvaluateParams & {
22
- node: Node;
22
+ node: ArenaRecordNode;
23
23
  query: string;
24
24
  item?: CategoryItem | Taxon;
25
25
  }): Promise<any>;
26
26
  private _getApplicableExpressions;
27
27
  evalApplicableExpressions(params: ExpressionEvaluateParams & {
28
- nodeCtx: Node;
28
+ nodeCtx: ArenaRecordNode;
29
29
  expressions: NodeDefExpression[];
30
30
  stopAtFirstFound?: boolean;
31
31
  }): Promise<{
@@ -33,7 +33,7 @@ export declare class RecordExpressionEvaluator extends JavascriptExpressionEvalu
33
33
  value: any;
34
34
  }[]>;
35
35
  evalApplicableExpression(params: ExpressionEvaluateParams & {
36
- nodeCtx: Node;
36
+ nodeCtx: ArenaRecordNode;
37
37
  expressions: NodeDefExpression[];
38
38
  }): Promise<{
39
39
  expression: NodeDefExpression;
@@ -1 +1 @@
1
- {"version":3,"file":"recordExpressionEvaluator.js","sourceRoot":"","sources":["../../../src/record/recordExpressionEvaluator/recordExpressionEvaluator.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,iDAAoF;AAGpF,2CAA2D;AAC3D,yCAA8C;AAE9C,uCAAqC;AACrC,wCAAoC;AAEpC,2CAAuD;AACvD,kDAA6D;AAC7D,wDAA0D;AAW1D,+BAAuC,SAAQ,0CAAsD;IACnG;QACE,KAAK,CAAC,qCAAyB,EAAE;YAC/B,CAAC,+BAAkB,CAAC,UAAU,CAAC,EAAE,sCAAyB;YAC1D,CAAC,+BAAkB,CAAC,IAAI,CAAC,EAAE,mCAAmB;SAC/C,CAAC,CAAA;IACJ,CAAC;IAEK,cAAc,CAClB,MAIC;;YAED,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;YACpD,MAAM,OAAO,GAAG,gBAAO,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;YAC5E,MAAM,WAAW,GAAG,kBAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAA;YACvF,IAAI,CAAC,WAAW;gBAAE,OAAO,IAAI,CAAA;YAC7B,MAAM,OAAO,mCAAiC,MAAM,KAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,GAAE,CAAA;YACjH,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACtC,CAAC;KAAA;IAEa,yBAAyB,CACrC,MAIC;;YAED,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,GAAG,KAAK,EAAE,GAAG,MAAM,CAAA;YACjE,MAAM,qBAAqB,GAAwB,EAAE,CAAA;YAErD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAA;gBAEtC,IACE,eAAO,CAAC,OAAO,CAAC,WAAW,CAAC;oBAC5B,CAAC,MAAM,IAAI,CAAC,cAAc,iCAAM,MAAM,KAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,EAAE,IAAG,CAAC,EACnF,CAAC;oBACD,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;oBAEtC,IAAI,gBAAgB,EAAE,CAAC;wBACrB,MAAK;oBACP,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,qBAAqB,CAAA;QAC9B,CAAC;KAAA;IAEK,yBAAyB,CAC7B,MAIC;;YAED,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;YAC1B,MAAM,qBAAqB,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAA;YAE1E,OAAO,OAAO,CAAC,GAAG,CAChB,qBAAqB,CAAC,GAAG,CAAC,CAAO,UAAU,EAAE,EAAE,+DAAC,CAAC;gBAC/C,UAAU;gBACV,KAAK,EAAE,MAAM,IAAI,CAAC,cAAc,iCAAM,MAAM,KAAE,IAAI,EAAE,OAAO,EAAE,KAAK,QAAE,UAAU,CAAC,UAAU,mCAAI,EAAE,IAAG;aACnG,CAAC,IAAA,CAAC,CACJ,CAAA;QACH,CAAC;KAAA;IAEK,wBAAwB,CAC5B,MAGC;;;YAED,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,yBAAyB,iCAAM,MAAM,KAAE,gBAAgB,EAAE,IAAI,IAAG,CAAA;YACxG,aAAO,oBAAoB,CAAC,CAAC,CAAC,mCAAI,IAAI,CAAA;QACxC,CAAC;KAAA;CACF","sourcesContent":["import type { ArenaRecord } from '../record'\nimport { User } from '../../auth'\nimport { CategoryItem } from '../../category'\nimport { ExpressionNodeType, JavascriptExpressionEvaluator } from '../../expression'\nimport { LanguageCode } from '../../language'\nimport { Node } from '../../node'\nimport { NodeDefExpression, NodeDefs } from '../../nodeDef'\nimport { Survey, Surveys } from '../../survey'\nimport { Taxon } from '../../taxonomy'\nimport { Objects } from '../../utils'\nimport { Records } from '../records'\nimport { RecordExpressionContext } from './context'\nimport { recordExpressionFunctions } from './functions'\nimport { RecordIdentifierEvaluator } from './node/identifier'\nimport { RecordThisEvaluator } from './node/thisEvaluator'\n\ntype ExpressionEvaluateParams = {\n user: User\n survey: Survey\n record: ArenaRecord\n prevCycleRecord?: ArenaRecord\n timezoneOffset?: number\n lang?: LanguageCode\n}\n\nexport class RecordExpressionEvaluator extends JavascriptExpressionEvaluator<RecordExpressionContext> {\n constructor() {\n super(recordExpressionFunctions, {\n [ExpressionNodeType.Identifier]: RecordIdentifierEvaluator,\n [ExpressionNodeType.This]: RecordThisEvaluator,\n })\n }\n\n async evalExpression(\n params: ExpressionEvaluateParams & {\n node: Node\n query: string\n item?: CategoryItem | Taxon\n }\n ): Promise<any> {\n const { survey, record, node, query, item } = params\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: node.nodeDefUuid })\n const nodeContext = NodeDefs.isEntity(nodeDef) ? node : Records.getParent(node)(record)\n if (!nodeContext) return null\n const context: RecordExpressionContext = { ...params, nodeContext, nodeCurrent: node, object: nodeContext, item }\n return this.evaluate(query, context)\n }\n\n private async _getApplicableExpressions(\n params: ExpressionEvaluateParams & {\n nodeCtx: Node\n expressions: NodeDefExpression[]\n stopAtFirstFound?: boolean\n }\n ): Promise<NodeDefExpression[]> {\n const { nodeCtx, expressions, stopAtFirstFound = false } = params\n const applicableExpressions: NodeDefExpression[] = []\n\n for (const expression of expressions) {\n const applyIfExpr = expression.applyIf\n\n if (\n Objects.isEmpty(applyIfExpr) ||\n (await this.evalExpression({ ...params, node: nodeCtx, query: applyIfExpr ?? '' }))\n ) {\n applicableExpressions.push(expression)\n\n if (stopAtFirstFound) {\n break\n }\n }\n }\n return applicableExpressions\n }\n\n async evalApplicableExpressions(\n params: ExpressionEvaluateParams & {\n nodeCtx: Node\n expressions: NodeDefExpression[]\n stopAtFirstFound?: boolean\n }\n ): Promise<{ expression: NodeDefExpression; value: any }[]> {\n const { nodeCtx } = params\n const applicableExpressions = await this._getApplicableExpressions(params)\n\n return Promise.all(\n applicableExpressions.map(async (expression) => ({\n expression,\n value: await this.evalExpression({ ...params, node: nodeCtx, query: expression.expression ?? '' }),\n }))\n )\n }\n\n async evalApplicableExpression(\n params: ExpressionEvaluateParams & {\n nodeCtx: Node\n expressions: NodeDefExpression[]\n }\n ): Promise<{ expression: NodeDefExpression; value: any } | null> {\n const expressionsEvaluated = await this.evalApplicableExpressions({ ...params, stopAtFirstFound: true })\n return expressionsEvaluated[0] ?? null\n }\n}\n"]}
1
+ {"version":3,"file":"recordExpressionEvaluator.js","sourceRoot":"","sources":["../../../src/record/recordExpressionEvaluator/recordExpressionEvaluator.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,iDAAoF;AAGpF,2CAA2D;AAC3D,yCAA8C;AAE9C,uCAAqC;AACrC,wCAAoC;AAEpC,2CAAuD;AACvD,kDAA6D;AAC7D,wDAA0D;AAW1D,+BAAuC,SAAQ,0CAAsD;IACnG;QACE,KAAK,CAAC,qCAAyB,EAAE;YAC/B,CAAC,+BAAkB,CAAC,UAAU,CAAC,EAAE,sCAAyB;YAC1D,CAAC,+BAAkB,CAAC,IAAI,CAAC,EAAE,mCAAmB;SAC/C,CAAC,CAAA;IACJ,CAAC;IAEK,cAAc,CAClB,MAIC;;YAED,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;YACpD,MAAM,OAAO,GAAG,gBAAO,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;YAC5E,MAAM,WAAW,GAAG,kBAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAA;YACvF,IAAI,CAAC,WAAW;gBAAE,OAAO,IAAI,CAAA;YAC7B,MAAM,OAAO,mCAAiC,MAAM,KAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,GAAE,CAAA;YACjH,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACtC,CAAC;KAAA;IAEa,yBAAyB,CACrC,MAIC;;YAED,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,GAAG,KAAK,EAAE,GAAG,MAAM,CAAA;YACjE,MAAM,qBAAqB,GAAwB,EAAE,CAAA;YAErD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAA;gBAEtC,IACE,eAAO,CAAC,OAAO,CAAC,WAAW,CAAC;oBAC5B,CAAC,MAAM,IAAI,CAAC,cAAc,iCAAM,MAAM,KAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,EAAE,IAAG,CAAC,EACnF,CAAC;oBACD,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;oBAEtC,IAAI,gBAAgB,EAAE,CAAC;wBACrB,MAAK;oBACP,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,qBAAqB,CAAA;QAC9B,CAAC;KAAA;IAEK,yBAAyB,CAC7B,MAIC;;YAED,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;YAC1B,MAAM,qBAAqB,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAA;YAE1E,OAAO,OAAO,CAAC,GAAG,CAChB,qBAAqB,CAAC,GAAG,CAAC,CAAO,UAAU,EAAE,EAAE,+DAAC,CAAC;gBAC/C,UAAU;gBACV,KAAK,EAAE,MAAM,IAAI,CAAC,cAAc,iCAAM,MAAM,KAAE,IAAI,EAAE,OAAO,EAAE,KAAK,QAAE,UAAU,CAAC,UAAU,mCAAI,EAAE,IAAG;aACnG,CAAC,IAAA,CAAC,CACJ,CAAA;QACH,CAAC;KAAA;IAEK,wBAAwB,CAC5B,MAGC;;;YAED,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,yBAAyB,iCAAM,MAAM,KAAE,gBAAgB,EAAE,IAAI,IAAG,CAAA;YACxG,aAAO,oBAAoB,CAAC,CAAC,CAAC,mCAAI,IAAI,CAAA;QACxC,CAAC;KAAA;CACF","sourcesContent":["import type { ArenaRecord } from '../record'\nimport { User } from '../../auth'\nimport { CategoryItem } from '../../category'\nimport { ExpressionNodeType, JavascriptExpressionEvaluator } from '../../expression'\nimport { LanguageCode } from '../../language'\nimport { ArenaRecordNode } from '../../node'\nimport { NodeDefExpression, NodeDefs } from '../../nodeDef'\nimport { Survey, Surveys } from '../../survey'\nimport { Taxon } from '../../taxonomy'\nimport { Objects } from '../../utils'\nimport { Records } from '../records'\nimport { RecordExpressionContext } from './context'\nimport { recordExpressionFunctions } from './functions'\nimport { RecordIdentifierEvaluator } from './node/identifier'\nimport { RecordThisEvaluator } from './node/thisEvaluator'\n\ntype ExpressionEvaluateParams = {\n user: User\n survey: Survey\n record: ArenaRecord\n prevCycleRecord?: ArenaRecord\n timezoneOffset?: number\n lang?: LanguageCode\n}\n\nexport class RecordExpressionEvaluator extends JavascriptExpressionEvaluator<RecordExpressionContext> {\n constructor() {\n super(recordExpressionFunctions, {\n [ExpressionNodeType.Identifier]: RecordIdentifierEvaluator,\n [ExpressionNodeType.This]: RecordThisEvaluator,\n })\n }\n\n async evalExpression(\n params: ExpressionEvaluateParams & {\n node: ArenaRecordNode\n query: string\n item?: CategoryItem | Taxon\n }\n ): Promise<any> {\n const { survey, record, node, query, item } = params\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: node.nodeDefUuid })\n const nodeContext = NodeDefs.isEntity(nodeDef) ? node : Records.getParent(node)(record)\n if (!nodeContext) return null\n const context: RecordExpressionContext = { ...params, nodeContext, nodeCurrent: node, object: nodeContext, item }\n return this.evaluate(query, context)\n }\n\n private async _getApplicableExpressions(\n params: ExpressionEvaluateParams & {\n nodeCtx: ArenaRecordNode\n expressions: NodeDefExpression[]\n stopAtFirstFound?: boolean\n }\n ): Promise<NodeDefExpression[]> {\n const { nodeCtx, expressions, stopAtFirstFound = false } = params\n const applicableExpressions: NodeDefExpression[] = []\n\n for (const expression of expressions) {\n const applyIfExpr = expression.applyIf\n\n if (\n Objects.isEmpty(applyIfExpr) ||\n (await this.evalExpression({ ...params, node: nodeCtx, query: applyIfExpr ?? '' }))\n ) {\n applicableExpressions.push(expression)\n\n if (stopAtFirstFound) {\n break\n }\n }\n }\n return applicableExpressions\n }\n\n async evalApplicableExpressions(\n params: ExpressionEvaluateParams & {\n nodeCtx: ArenaRecordNode\n expressions: NodeDefExpression[]\n stopAtFirstFound?: boolean\n }\n ): Promise<{ expression: NodeDefExpression; value: any }[]> {\n const { nodeCtx } = params\n const applicableExpressions = await this._getApplicableExpressions(params)\n\n return Promise.all(\n applicableExpressions.map(async (expression) => ({\n expression,\n value: await this.evalExpression({ ...params, node: nodeCtx, query: expression.expression ?? '' }),\n }))\n )\n }\n\n async evalApplicableExpression(\n params: ExpressionEvaluateParams & {\n nodeCtx: ArenaRecordNode\n expressions: NodeDefExpression[]\n }\n ): Promise<{ expression: NodeDefExpression; value: any } | null> {\n const expressionsEvaluated = await this.evalApplicableExpressions({ ...params, stopAtFirstFound: true })\n return expressionsEvaluated[0] ?? null\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"recordFixer.js","sourceRoot":"","sources":["../../src/record/recordFixer.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeFactory, Nodes } from '../node'\nimport { NodeDef, NodeDefCode, NodeDefs, NodeDefType } from '../nodeDef'\nimport { Survey, Surveys } from '../survey'\nimport { Objects } from '../utils'\nimport type { ArenaRecord, ArenaRecordNode } from './record'\nimport { RecordUpdateResult } from './recordNodesUpdater'\nimport { Records } from './records'\n\nconst fixCodeAttribute = (params: {\n survey: Survey\n nodeDef: NodeDefCode\n record: ArenaRecord\n node: ArenaRecordNode\n sideEffect: boolean\n}): ArenaRecordNode => {\n const { survey, nodeDef, record, node, sideEffect } = params\n if (!NodeDefs.getParentCodeDefUuid(nodeDef) || Objects.isNotEmpty(Nodes.getHierarchyCode(node))) {\n // nodeDef is not a code attribute or meta.hCode already populated: do nothing\n return node\n }\n const parentNode = Records.getParent(node)(record)\n if (!parentNode) {\n // missing parent node; node parentUuid could be invalid\n return node\n }\n // populate meta.hCode with ancestor code attribute node uuids\n const hCode: string[] = []\n let currentCodeDef: NodeDefCode = nodeDef\n let currentParentCodeAttribute = Records.getParentCodeAttribute({ parentNode, nodeDef: currentCodeDef })(record)\n while (currentParentCodeAttribute) {\n hCode.unshift(currentParentCodeAttribute.uuid)\n currentCodeDef = Surveys.getNodeDefByUuid({ survey, uuid: currentParentCodeAttribute.nodeDefUuid }) as NodeDefCode\n currentParentCodeAttribute = Records.getParentCodeAttribute({ parentNode, nodeDef: currentCodeDef })(record)\n }\n const nodeUpdated = sideEffect ? node : { ...node }\n nodeUpdated.meta = { ...nodeUpdated.meta, hCode }\n return nodeUpdated\n}\n\nconst insertMissingSingleNode = (params: {\n survey: Survey\n nodeDef: NodeDef<any>\n record: ArenaRecord\n parentNode: ArenaRecordNode\n sideEffect: boolean\n}): RecordUpdateResult | null => {\n const { survey, nodeDef, record, parentNode, sideEffect } = params\n if (!NodeDefs.isSingle(nodeDef)) {\n // multiple node: don't insert it\n return null\n }\n const nodeDefUuid = nodeDef.uuid\n const children = Records.getChildren(parentNode, nodeDef.uuid)(record)\n if (!Objects.isEmpty(children)) {\n // single node already inserted\n return null\n }\n // insert missing single node\n const recordUuid = record.uuid\n let node = NodeFactory.createInstance({ nodeDefUuid, recordUuid, parentNode })\n\n if (nodeDef.type === NodeDefType.code) {\n node = fixCodeAttribute({ survey, nodeDef: nodeDef as NodeDefCode, record, node, sideEffect })\n }\n\n const recordUpdated = Records.addNode(node, { sideEffect })(record)\n return new RecordUpdateResult({ record: recordUpdated, nodes: { [node.uuid]: node } })\n}\n\nconst insertMissingSingleNodes = (params: {\n survey: Survey\n record: ArenaRecord\n sideEffect: boolean\n}): RecordUpdateResult => {\n const { survey, record, sideEffect } = params\n const updateResult = new RecordUpdateResult({ record })\n Surveys.visitNodeDefs({\n survey,\n visitor: (nodeDef) => {\n const parentDefUuid = nodeDef.parentUuid\n if (parentDefUuid) {\n const parentNodes = Records.getNodesByDefUuid(parentDefUuid)(updateResult.record)\n for (const parentNode of parentNodes) {\n const partialUpdateResult = insertMissingSingleNode({\n survey,\n nodeDef,\n record: updateResult.record,\n parentNode,\n sideEffect,\n })\n if (partialUpdateResult) {\n updateResult.merge(partialUpdateResult)\n }\n }\n }\n },\n })\n return updateResult\n}\n\nconst deleteNodesByDefUuid = (params: { record: ArenaRecord; nodeDefUuid: string; sideEffect: boolean }) => {\n const { record, nodeDefUuid, sideEffect } = params\n const updateResult = new RecordUpdateResult({ record })\n\n const recordUpdateOptions = { sideEffect }\n\n const nodesToDelete = Records.getNodesByDefUuid(nodeDefUuid)(updateResult.record)\n for (const nodeToDelete of nodesToDelete) {\n // cleanup child applicability\n const parentNode = Records.getParent(nodeToDelete)(updateResult.record)\n if (parentNode && !Nodes.isChildApplicable(parentNode, nodeDefUuid)) {\n const parentNodeUpdated = Nodes.dissocChildApplicability(parentNode, nodeDefUuid)\n const recordWithParentNodeUpdated = Records.addNode(parentNodeUpdated, recordUpdateOptions)(updateResult.record)\n updateResult.merge(new RecordUpdateResult({ record: recordWithParentNodeUpdated }))\n }\n }\n const nodeUuidsToDelete = nodesToDelete.map((node) => node.uuid)\n const nodesDeleteUpdateResult = Records.deleteNodes(nodeUuidsToDelete, recordUpdateOptions)(updateResult.record)\n updateResult.merge(nodesDeleteUpdateResult)\n\n return updateResult\n}\n\n/**\n * Fix a record by:\n * - inserting missing single nodes\n * - deleting nodes with non existing node defs\n * - removing status flags (created, deleted, updated) from all nodes\n */\nconst fixRecord = (params: { survey: Survey; record: ArenaRecord; sideEffect?: boolean }): RecordUpdateResult => {\n const { survey, record, sideEffect = false } = params\n const result = new RecordUpdateResult({ record })\n\n // 1. delete nodes with non existing node defs (and their descendants), once per missing node def\n const missingNodeDefUuids = new Set<string>()\n for (const { nodeDefUuid } of Records.getNodesArray(record)) {\n if (!Surveys.findNodeDefByUuid({ survey, uuid: nodeDefUuid })) {\n missingNodeDefUuids.add(nodeDefUuid)\n }\n }\n for (const nodeDefUuid of missingNodeDefUuids) {\n result.merge(deleteNodesByDefUuid({ record: result.record, nodeDefUuid, sideEffect }))\n }\n\n // 2. fix the remaining nodes (read from the updated record, without the deleted nodes); add them all at once\n const nodesUpdated: { [key: string]: ArenaRecordNode } = {}\n for (const node of Records.getNodesArray(result.record)) {\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: node.nodeDefUuid })\n // remove status flags\n let nodeUpdated = Nodes.removeStatusFlags({ node, sideEffect })\n\n if (nodeDef.type === NodeDefType.code) {\n nodeUpdated = fixCodeAttribute({\n survey,\n nodeDef: nodeDef as NodeDefCode,\n record: result.record,\n node: nodeUpdated,\n sideEffect,\n })\n }\n nodesUpdated[nodeUpdated.uuid] = nodeUpdated\n }\n const recordWithNodesUpdated = Records.addNodes(nodesUpdated, { sideEffect })(result.record)\n result.merge(new RecordUpdateResult({ record: recordWithNodesUpdated, nodes: nodesUpdated }))\n\n const missingNodesUpdateResult = insertMissingSingleNodes({ survey, record: result.record, sideEffect })\n result.merge(missingNodesUpdateResult)\n return result\n}\n\nexport const RecordFixer = {\n fixRecord,\n insertMissingSingleNodes,\n}\n"]}
1
+ {"version":3,"file":"recordFixer.js","sourceRoot":"","sources":["../../src/record/recordFixer.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArenaRecordNode, NodeFactory, Nodes } from '../node'\nimport { NodeDef, NodeDefCode, NodeDefs, NodeDefType } from '../nodeDef'\nimport { Survey, Surveys } from '../survey'\nimport { Objects } from '../utils'\nimport type { ArenaRecord } from './record'\nimport { RecordUpdateResult } from './recordNodesUpdater'\nimport { Records } from './records'\n\nconst fixCodeAttribute = (params: {\n survey: Survey\n nodeDef: NodeDefCode\n record: ArenaRecord\n node: ArenaRecordNode\n sideEffect: boolean\n}): ArenaRecordNode => {\n const { survey, nodeDef, record, node, sideEffect } = params\n if (!NodeDefs.getParentCodeDefUuid(nodeDef) || Objects.isNotEmpty(Nodes.getHierarchyCode(node))) {\n // nodeDef is not a code attribute or meta.hCode already populated: do nothing\n return node\n }\n const parentNode = Records.getParent(node)(record)\n if (!parentNode) {\n // missing parent node; node parentUuid could be invalid\n return node\n }\n // populate meta.hCode with ancestor code attribute node uuids\n const hCode: string[] = []\n let currentCodeDef: NodeDefCode = nodeDef\n let currentParentCodeAttribute = Records.getParentCodeAttribute({ parentNode, nodeDef: currentCodeDef })(record)\n while (currentParentCodeAttribute) {\n hCode.unshift(currentParentCodeAttribute.uuid)\n currentCodeDef = Surveys.getNodeDefByUuid({ survey, uuid: currentParentCodeAttribute.nodeDefUuid }) as NodeDefCode\n currentParentCodeAttribute = Records.getParentCodeAttribute({ parentNode, nodeDef: currentCodeDef })(record)\n }\n const nodeUpdated = sideEffect ? node : { ...node }\n nodeUpdated.meta = { ...nodeUpdated.meta, hCode }\n return nodeUpdated\n}\n\nconst insertMissingSingleNode = (params: {\n survey: Survey\n nodeDef: NodeDef<any>\n record: ArenaRecord\n parentNode: ArenaRecordNode\n sideEffect: boolean\n}): RecordUpdateResult | null => {\n const { survey, nodeDef, record, parentNode, sideEffect } = params\n if (!NodeDefs.isSingle(nodeDef)) {\n // multiple node: don't insert it\n return null\n }\n const nodeDefUuid = nodeDef.uuid\n const children = Records.getChildren(parentNode, nodeDef.uuid)(record)\n if (!Objects.isEmpty(children)) {\n // single node already inserted\n return null\n }\n // insert missing single node\n const recordUuid = record.uuid\n let node = NodeFactory.createInstance({ nodeDefUuid, recordUuid, parentNode })\n\n if (nodeDef.type === NodeDefType.code) {\n node = fixCodeAttribute({ survey, nodeDef: nodeDef as NodeDefCode, record, node, sideEffect })\n }\n\n const recordUpdated = Records.addNode(node, { sideEffect })(record)\n return new RecordUpdateResult({ record: recordUpdated, nodes: { [node.uuid]: node } })\n}\n\nconst insertMissingSingleNodes = (params: {\n survey: Survey\n record: ArenaRecord\n sideEffect: boolean\n}): RecordUpdateResult => {\n const { survey, record, sideEffect } = params\n const updateResult = new RecordUpdateResult({ record })\n Surveys.visitNodeDefs({\n survey,\n visitor: (nodeDef) => {\n const parentDefUuid = nodeDef.parentUuid\n if (parentDefUuid) {\n const parentNodes = Records.getNodesByDefUuid(parentDefUuid)(updateResult.record)\n for (const parentNode of parentNodes) {\n const partialUpdateResult = insertMissingSingleNode({\n survey,\n nodeDef,\n record: updateResult.record,\n parentNode,\n sideEffect,\n })\n if (partialUpdateResult) {\n updateResult.merge(partialUpdateResult)\n }\n }\n }\n },\n })\n return updateResult\n}\n\nconst deleteNodesByDefUuid = (params: { record: ArenaRecord; nodeDefUuid: string; sideEffect: boolean }) => {\n const { record, nodeDefUuid, sideEffect } = params\n const updateResult = new RecordUpdateResult({ record })\n\n const recordUpdateOptions = { sideEffect }\n\n const nodesToDelete = Records.getNodesByDefUuid(nodeDefUuid)(updateResult.record)\n for (const nodeToDelete of nodesToDelete) {\n // cleanup child applicability\n const parentNode = Records.getParent(nodeToDelete)(updateResult.record)\n if (parentNode && !Nodes.isChildApplicable(parentNode, nodeDefUuid)) {\n const parentNodeUpdated = Nodes.dissocChildApplicability(parentNode, nodeDefUuid)\n const recordWithParentNodeUpdated = Records.addNode(parentNodeUpdated, recordUpdateOptions)(updateResult.record)\n updateResult.merge(new RecordUpdateResult({ record: recordWithParentNodeUpdated }))\n }\n }\n const nodeUuidsToDelete = nodesToDelete.map((node) => node.uuid)\n const nodesDeleteUpdateResult = Records.deleteNodes(nodeUuidsToDelete, recordUpdateOptions)(updateResult.record)\n updateResult.merge(nodesDeleteUpdateResult)\n\n return updateResult\n}\n\n/**\n * Fix a record by:\n * - inserting missing single nodes\n * - deleting nodes with non existing node defs\n * - removing status flags (created, deleted, updated) from all nodes\n */\nconst fixRecord = (params: { survey: Survey; record: ArenaRecord; sideEffect?: boolean }): RecordUpdateResult => {\n const { survey, record, sideEffect = false } = params\n const result = new RecordUpdateResult({ record })\n\n // 1. delete nodes with non existing node defs (and their descendants), once per missing node def\n const missingNodeDefUuids = new Set<string>()\n for (const { nodeDefUuid } of Records.getNodesArray(record)) {\n if (!Surveys.findNodeDefByUuid({ survey, uuid: nodeDefUuid })) {\n missingNodeDefUuids.add(nodeDefUuid)\n }\n }\n for (const nodeDefUuid of missingNodeDefUuids) {\n result.merge(deleteNodesByDefUuid({ record: result.record, nodeDefUuid, sideEffect }))\n }\n\n // 2. fix the remaining nodes (read from the updated record, without the deleted nodes); add them all at once\n const nodesUpdated: { [key: string]: ArenaRecordNode } = {}\n for (const node of Records.getNodesArray(result.record)) {\n const nodeDef = Surveys.getNodeDefByUuid({ survey, uuid: node.nodeDefUuid })\n // remove status flags\n let nodeUpdated = Nodes.removeStatusFlags({ node, sideEffect })\n\n if (nodeDef.type === NodeDefType.code) {\n nodeUpdated = fixCodeAttribute({\n survey,\n nodeDef: nodeDef as NodeDefCode,\n record: result.record,\n node: nodeUpdated,\n sideEffect,\n })\n }\n nodesUpdated[nodeUpdated.uuid] = nodeUpdated\n }\n const recordWithNodesUpdated = Records.addNodes(nodesUpdated, { sideEffect })(result.record)\n result.merge(new RecordUpdateResult({ record: recordWithNodesUpdated, nodes: nodesUpdated }))\n\n const missingNodesUpdateResult = insertMissingSingleNodes({ survey, record: result.record, sideEffect })\n result.merge(missingNodesUpdateResult)\n return result\n}\n\nexport const RecordFixer = {\n fixRecord,\n insertMissingSingleNodes,\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  import { User } from '../../auth';
2
- import { Node } from '../../node';
2
+ import { ArenaRecordNode } from '../../node';
3
3
  import { NodeDefEntity } from '../../nodeDef';
4
4
  import { Survey } from '../../survey';
5
- import { Record } from '../record';
5
+ import { ArenaRecord } from '../record';
6
6
  /**
7
7
  * Evaluates the entity's enumeratingItemsExpression and returns the allowed category item codes.
8
8
  *
@@ -12,7 +12,7 @@ import { Record } from '../record';
12
12
  export declare const getEnumeratingItemsAllowedCodes: (params: {
13
13
  survey: Survey;
14
14
  user: User;
15
- record: Record;
15
+ record: ArenaRecord;
16
16
  entityDef: NodeDefEntity;
17
- parentNode: Node;
17
+ parentNode: ArenaRecordNode;
18
18
  }) => Promise<Set<string> | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"recordEnumeratingItemsExpressionEvaluator.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordEnumeratingItemsExpressionEvaluator.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,2CAAuD;AAGvD,4EAAwE;AAExE,MAAM,mBAAmB,GAAG,IAAI,qDAAyB,EAAE,CAAA;AAE3D;;;;;GAKG;AACI,MAAM,+BAA+B,GAAG,CAAO,MAMrD,EAAoC,EAAE;IACrC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,CAAA;IAC9D,MAAM,UAAU,GAAG,kBAAQ,CAAC,6BAA6B,CAAC,SAAS,CAAC,CAAA;IACpE,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAA;IAEjC,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,cAAc,CAAC;QACtD,IAAI;QACJ,MAAM;QACN,MAAM;QACN,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;KAClB,CAAC,CAAA;IAEF,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,GAAG,EAAU,CAAA;IAC/D,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;AAC7G,CAAC,CAAA,CAAA;AArBY,QAAA,+BAA+B,GAA/B,+BAA+B,CAqB3C","sourcesContent":["import { User } from '../../auth'\nimport { Node } from '../../node'\nimport { NodeDefEntity, NodeDefs } from '../../nodeDef'\nimport { Survey } from '../../survey'\nimport { Record } from '../record'\nimport { RecordExpressionEvaluator } from '../recordExpressionEvaluator'\n\nconst expressionEvaluator = new RecordExpressionEvaluator()\n\n/**\n * Evaluates the entity's enumeratingItemsExpression and returns the allowed category item codes.\n *\n * @param params - Evaluation context parameters.\n * @returns Allowed category item codes, or undefined when no expression is configured.\n */\nexport const getEnumeratingItemsAllowedCodes = async (params: {\n survey: Survey\n user: User\n record: Record\n entityDef: NodeDefEntity\n parentNode: Node\n}): Promise<Set<string> | undefined> => {\n const { survey, user, record, entityDef, parentNode } = params\n const expression = NodeDefs.getEnumeratingItemsExpression(entityDef)\n if (!expression) return undefined\n\n const result = await expressionEvaluator.evalExpression({\n user,\n survey,\n record,\n node: parentNode,\n query: expression,\n })\n\n if (!result || !Array.isArray(result)) return new Set<string>()\n return new Set(result.filter((value) => value !== null && value !== undefined && value !== '').map(String))\n}\n"]}
1
+ {"version":3,"file":"recordEnumeratingItemsExpressionEvaluator.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordEnumeratingItemsExpressionEvaluator.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,2CAAuD;AAGvD,4EAAwE;AAExE,MAAM,mBAAmB,GAAG,IAAI,qDAAyB,EAAE,CAAA;AAE3D;;;;;GAKG;AACI,MAAM,+BAA+B,GAAG,CAAO,MAMrD,EAAoC,EAAE;IACrC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,CAAA;IAC9D,MAAM,UAAU,GAAG,kBAAQ,CAAC,6BAA6B,CAAC,SAAS,CAAC,CAAA;IACpE,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAA;IAEjC,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,cAAc,CAAC;QACtD,IAAI;QACJ,MAAM;QACN,MAAM;QACN,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;KAClB,CAAC,CAAA;IAEF,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,GAAG,EAAU,CAAA;IAC/D,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;AAC7G,CAAC,CAAA,CAAA;AArBY,QAAA,+BAA+B,GAA/B,+BAA+B,CAqB3C","sourcesContent":["import { User } from '../../auth'\nimport { ArenaRecordNode } from '../../node'\nimport { NodeDefEntity, NodeDefs } from '../../nodeDef'\nimport { Survey } from '../../survey'\nimport { ArenaRecord } from '../record'\nimport { RecordExpressionEvaluator } from '../recordExpressionEvaluator'\n\nconst expressionEvaluator = new RecordExpressionEvaluator()\n\n/**\n * Evaluates the entity's enumeratingItemsExpression and returns the allowed category item codes.\n *\n * @param params - Evaluation context parameters.\n * @returns Allowed category item codes, or undefined when no expression is configured.\n */\nexport const getEnumeratingItemsAllowedCodes = async (params: {\n survey: Survey\n user: User\n record: ArenaRecord\n entityDef: NodeDefEntity\n parentNode: ArenaRecordNode\n}): Promise<Set<string> | undefined> => {\n const { survey, user, record, entityDef, parentNode } = params\n const expression = NodeDefs.getEnumeratingItemsExpression(entityDef)\n if (!expression) return undefined\n\n const result = await expressionEvaluator.evalExpression({\n user,\n survey,\n record,\n node: parentNode,\n query: expression,\n })\n\n if (!result || !Array.isArray(result)) return new Set<string>()\n return new Set(result.filter((value) => value !== null && value !== undefined && value !== '').map(String))\n}\n"]}
@@ -1,13 +1,13 @@
1
- import { Node } from '../../node';
1
+ import { ArenaRecordNode } from '../../node';
2
2
  import { Survey } from '../../survey';
3
- import { Record } from '../record';
3
+ import { ArenaRecord } from '../record';
4
4
  import { NodeDef } from '../../nodeDef';
5
5
  import { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider';
6
6
  import { TaxonProvider } from '../../nodeDefExpressionEvaluator/taxonProvider';
7
7
  interface ToNodeValueParams {
8
8
  survey: Survey;
9
- record: Record;
10
- nodeParent: Node;
9
+ record: ArenaRecord;
10
+ nodeParent: ArenaRecordNode;
11
11
  nodeDef: NodeDef<any>;
12
12
  valueExpr: string;
13
13
  timezoneOffset?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"recordExpressionValueConverter.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordExpressionValueConverter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Point, Points } from '../../geo'\nimport { Node, NodeValueCode, NodeValueTaxon } from '../../node'\nimport { Survey, Surveys } from '../../survey'\nimport { Record } from '../record'\nimport { Records } from '../records'\nimport { NodeDef, NodeDefType, NodeDefs, NodeDefCodeProps, NodeDefTaxon, NodeDefCode } from '../../nodeDef'\nimport { Dates, DateFormats, Objects } from '../../utils'\nimport { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider'\nimport { TaxonProvider } from '../../nodeDefExpressionEvaluator/taxonProvider'\n\ninterface ToNodeValueParams {\n survey: Survey\n record: Record\n nodeParent: Node\n nodeDef: NodeDef<any>\n valueExpr: string\n timezoneOffset?: number\n categoryItemProvider?: CategoryItemProvider\n taxonProvider?: TaxonProvider\n}\n\nconst _toPrimitive = (TypeTo: any) => (params: ToNodeValueParams) => {\n const { valueExpr: val } = params\n return TypeTo(val)\n}\n\nconst _toBoolean = (params: ToNodeValueParams) => {\n const { valueExpr } = params\n if (['true', 'false'].includes(String(valueExpr))) return String(valueExpr)\n return null\n}\n\nconst _findCategoryItemUuidByCode = async (params: {\n survey: Survey\n record: Record\n nodeDef: NodeDefCode\n nodeParent: Node\n code: string\n categoryItemProvider?: CategoryItemProvider\n}): Promise<string | undefined> => {\n const { survey, record, nodeDef, nodeParent, code, categoryItemProvider } = params\n const codeNodeDef = nodeDef as NodeDef<NodeDefType.code, NodeDefCodeProps>\n\n const categoryItemUuid = Records.getCategoryItemUuid({\n survey,\n record,\n nodeDef: codeNodeDef,\n parentNode: nodeParent,\n code,\n })\n if (categoryItemUuid) return categoryItemUuid\n if (!categoryItemProvider) return undefined\n\n const categoryUuid = NodeDefs.getCategoryUuid(nodeDef)\n if (!categoryUuid) return undefined\n const codePaths = [...Records.getAncestorCodePath({ survey, record, parentNode: nodeParent, nodeDef }), code]\n const draft = !!record.preview\n const item = await categoryItemProvider.getItemByCodePaths({ survey, categoryUuid, codePaths, draft })\n return item?.uuid\n}\n\nconst _toCode = async (params: ToNodeValueParams): Promise<NodeValueCode | null> => {\n const { survey, record, nodeDef, nodeParent, valueExpr, categoryItemProvider } = params\n\n if (!nodeParent) return null\n\n // ValueExpr is the code of a category item\n const code = String(valueExpr)\n\n const categoryItemUuid = await _findCategoryItemUuidByCode({\n survey,\n record,\n nodeDef: nodeDef as NodeDefCode,\n nodeParent,\n code,\n categoryItemProvider,\n })\n\n return categoryItemUuid ? { itemUuid: categoryItemUuid } : null\n}\n\nconst _toCoordinate = (params: ToNodeValueParams): Point | null => {\n const { valueExpr } = params\n return Points.parse(valueExpr)\n}\n\nconst _toDateTime = (params: {\n valueExpr: any\n format: DateFormats\n formatsFrom: DateFormats[]\n timezoneOffset?: number\n}): string | null => {\n const { valueExpr, format, formatsFrom = [DateFormats.datetimeDefault], timezoneOffset } = params\n const formatFrom = formatsFrom.find((formt) => Dates.isValidDateInFormat(valueExpr, formt))\n if (!formatFrom) return null\n\n const date = Dates.parse(valueExpr, formatFrom)\n if (!date) return null\n\n // `date` encodes the parsed digits as if they were UTC (see Dates.parse/parseZone), so shift by the\n // client's offset (if any) and read the result back out in UTC - never in this machine's local time zone,\n // which would otherwise silently reintroduce the server's own timezone into the result.\n const dateWithTimezoneOffset = timezoneOffset ? new Date(date.getTime() - timezoneOffset * 60000) : date\n return Dates.formatUTC(dateWithTimezoneOffset, format)\n}\n\nconst findTaxonByCode = async (params: {\n survey: Survey\n nodeDef: NodeDefTaxon\n taxonCode: string\n draft: boolean\n taxonProvider?: TaxonProvider\n}) => {\n const { survey, nodeDef, taxonCode, taxonProvider, draft } = params\n const taxonomyUuid = NodeDefs.getTaxonomyUuid(nodeDef)!\n const taxon = Surveys.getTaxonByCode({ survey, taxonomyUuid, taxonCode })\n if (taxon) return taxon\n if (!taxonProvider) return null\n return taxonProvider.getTaxonByCode({ survey, taxonomyUuid, taxonCode, draft })\n}\n\nconst _toTaxon = async (params: ToNodeValueParams): Promise<NodeValueTaxon | null> => {\n const { survey, record, nodeDef, valueExpr, taxonProvider } = params\n\n // ValueExpr is the code of a taxon\n const taxonCode = String(valueExpr)\n\n const taxonNodeDef = nodeDef as NodeDefTaxon\n const draft = !!record.preview\n const taxon = await findTaxonByCode({ survey, nodeDef: taxonNodeDef, taxonCode, taxonProvider, draft })\n return taxon ? { taxonUuid: taxon.uuid } : null\n}\n\nconst _valueExprToValueNodeFns: { [key in NodeDefType]?: (params: ToNodeValueParams) => any } = {\n [NodeDefType.boolean]: _toBoolean,\n [NodeDefType.code]: _toCode,\n [NodeDefType.coordinate]: _toCoordinate,\n [NodeDefType.date]: (params: { valueExpr: any; timezoneOffset?: number }) => {\n const { valueExpr, timezoneOffset } = params\n return _toDateTime({\n valueExpr,\n format: DateFormats.dateStorage,\n formatsFrom: [DateFormats.datetimeStorage, DateFormats.datetimeDefault, DateFormats.dateStorage],\n timezoneOffset,\n })\n },\n [NodeDefType.decimal]: _toPrimitive(Number),\n [NodeDefType.geo]: (params: { valueExpr: any }) => {\n const { valueExpr } = params\n return typeof valueExpr === 'string' ? JSON.parse(valueExpr) : valueExpr\n },\n [NodeDefType.integer]: _toPrimitive(Number),\n [NodeDefType.taxon]: _toTaxon,\n [NodeDefType.text]: _toPrimitive(String),\n [NodeDefType.time]: (params: { nodeDef: NodeDef<any>; valueExpr: any; timezoneOffset?: number }) => {\n const { nodeDef, valueExpr, timezoneOffset } = params\n return _toDateTime({\n valueExpr,\n format: NodeDefs.isSecondsIncluded(nodeDef) ? DateFormats.timeWithSeconds : DateFormats.timeStorage,\n formatsFrom: [\n DateFormats.datetimeStorage,\n DateFormats.datetimeDefault,\n DateFormats.timeWithSeconds,\n DateFormats.timeStorage,\n ],\n timezoneOffset,\n })\n },\n}\n\nconst toNodeValue = (params: ToNodeValueParams): Promise<any> => {\n const { nodeDef, valueExpr } = params\n if (Objects.isEmpty(valueExpr)) return Promise.resolve(null)\n\n const fn = _valueExprToValueNodeFns[NodeDefs.getType(nodeDef)]\n return Promise.resolve(fn?.(params))\n}\n\nexport const RecordExpressionValueConverter = {\n toNodeValue,\n}\n"]}
1
+ {"version":3,"file":"recordExpressionValueConverter.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordExpressionValueConverter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Point, Points } from '../../geo'\nimport { ArenaRecordNode, NodeValueCode, NodeValueTaxon } from '../../node'\nimport { Survey, Surveys } from '../../survey'\nimport { ArenaRecord } from '../record'\nimport { Records } from '../records'\nimport { NodeDef, NodeDefType, NodeDefs, NodeDefCodeProps, NodeDefTaxon, NodeDefCode } from '../../nodeDef'\nimport { Dates, DateFormats, Objects } from '../../utils'\nimport { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider'\nimport { TaxonProvider } from '../../nodeDefExpressionEvaluator/taxonProvider'\n\ninterface ToNodeValueParams {\n survey: Survey\n record: ArenaRecord\n nodeParent: ArenaRecordNode\n nodeDef: NodeDef<any>\n valueExpr: string\n timezoneOffset?: number\n categoryItemProvider?: CategoryItemProvider\n taxonProvider?: TaxonProvider\n}\n\nconst _toPrimitive = (TypeTo: any) => (params: ToNodeValueParams) => {\n const { valueExpr: val } = params\n return TypeTo(val)\n}\n\nconst _toBoolean = (params: ToNodeValueParams) => {\n const { valueExpr } = params\n if (['true', 'false'].includes(String(valueExpr))) return String(valueExpr)\n return null\n}\n\nconst _findCategoryItemUuidByCode = async (params: {\n survey: Survey\n record: ArenaRecord\n nodeDef: NodeDefCode\n nodeParent: ArenaRecordNode\n code: string\n categoryItemProvider?: CategoryItemProvider\n}): Promise<string | undefined> => {\n const { survey, record, nodeDef, nodeParent, code, categoryItemProvider } = params\n const codeNodeDef = nodeDef as NodeDef<NodeDefType.code, NodeDefCodeProps>\n\n const categoryItemUuid = Records.getCategoryItemUuid({\n survey,\n record,\n nodeDef: codeNodeDef,\n parentNode: nodeParent,\n code,\n })\n if (categoryItemUuid) return categoryItemUuid\n if (!categoryItemProvider) return undefined\n\n const categoryUuid = NodeDefs.getCategoryUuid(nodeDef)\n if (!categoryUuid) return undefined\n const codePaths = [...Records.getAncestorCodePath({ survey, record, parentNode: nodeParent, nodeDef }), code]\n const draft = !!record.preview\n const item = await categoryItemProvider.getItemByCodePaths({ survey, categoryUuid, codePaths, draft })\n return item?.uuid\n}\n\nconst _toCode = async (params: ToNodeValueParams): Promise<NodeValueCode | null> => {\n const { survey, record, nodeDef, nodeParent, valueExpr, categoryItemProvider } = params\n\n if (!nodeParent) return null\n\n // ValueExpr is the code of a category item\n const code = String(valueExpr)\n\n const categoryItemUuid = await _findCategoryItemUuidByCode({\n survey,\n record,\n nodeDef: nodeDef as NodeDefCode,\n nodeParent,\n code,\n categoryItemProvider,\n })\n\n return categoryItemUuid ? { itemUuid: categoryItemUuid } : null\n}\n\nconst _toCoordinate = (params: ToNodeValueParams): Point | null => {\n const { valueExpr } = params\n return Points.parse(valueExpr)\n}\n\nconst _toDateTime = (params: {\n valueExpr: any\n format: DateFormats\n formatsFrom: DateFormats[]\n timezoneOffset?: number\n}): string | null => {\n const { valueExpr, format, formatsFrom = [DateFormats.datetimeDefault], timezoneOffset } = params\n const formatFrom = formatsFrom.find((formt) => Dates.isValidDateInFormat(valueExpr, formt))\n if (!formatFrom) return null\n\n const date = Dates.parse(valueExpr, formatFrom)\n if (!date) return null\n\n // `date` encodes the parsed digits as if they were UTC (see Dates.parse/parseZone), so shift by the\n // client's offset (if any) and read the result back out in UTC - never in this machine's local time zone,\n // which would otherwise silently reintroduce the server's own timezone into the result.\n const dateWithTimezoneOffset = timezoneOffset ? new Date(date.getTime() - timezoneOffset * 60000) : date\n return Dates.formatUTC(dateWithTimezoneOffset, format)\n}\n\nconst findTaxonByCode = async (params: {\n survey: Survey\n nodeDef: NodeDefTaxon\n taxonCode: string\n draft: boolean\n taxonProvider?: TaxonProvider\n}) => {\n const { survey, nodeDef, taxonCode, taxonProvider, draft } = params\n const taxonomyUuid = NodeDefs.getTaxonomyUuid(nodeDef)!\n const taxon = Surveys.getTaxonByCode({ survey, taxonomyUuid, taxonCode })\n if (taxon) return taxon\n if (!taxonProvider) return null\n return taxonProvider.getTaxonByCode({ survey, taxonomyUuid, taxonCode, draft })\n}\n\nconst _toTaxon = async (params: ToNodeValueParams): Promise<NodeValueTaxon | null> => {\n const { survey, record, nodeDef, valueExpr, taxonProvider } = params\n\n // ValueExpr is the code of a taxon\n const taxonCode = String(valueExpr)\n\n const taxonNodeDef = nodeDef as NodeDefTaxon\n const draft = !!record.preview\n const taxon = await findTaxonByCode({ survey, nodeDef: taxonNodeDef, taxonCode, taxonProvider, draft })\n return taxon ? { taxonUuid: taxon.uuid } : null\n}\n\nconst _valueExprToValueNodeFns: { [key in NodeDefType]?: (params: ToNodeValueParams) => any } = {\n [NodeDefType.boolean]: _toBoolean,\n [NodeDefType.code]: _toCode,\n [NodeDefType.coordinate]: _toCoordinate,\n [NodeDefType.date]: (params: { valueExpr: any; timezoneOffset?: number }) => {\n const { valueExpr, timezoneOffset } = params\n return _toDateTime({\n valueExpr,\n format: DateFormats.dateStorage,\n formatsFrom: [DateFormats.datetimeStorage, DateFormats.datetimeDefault, DateFormats.dateStorage],\n timezoneOffset,\n })\n },\n [NodeDefType.decimal]: _toPrimitive(Number),\n [NodeDefType.geo]: (params: { valueExpr: any }) => {\n const { valueExpr } = params\n return typeof valueExpr === 'string' ? JSON.parse(valueExpr) : valueExpr\n },\n [NodeDefType.integer]: _toPrimitive(Number),\n [NodeDefType.taxon]: _toTaxon,\n [NodeDefType.text]: _toPrimitive(String),\n [NodeDefType.time]: (params: { nodeDef: NodeDef<any>; valueExpr: any; timezoneOffset?: number }) => {\n const { nodeDef, valueExpr, timezoneOffset } = params\n return _toDateTime({\n valueExpr,\n format: NodeDefs.isSecondsIncluded(nodeDef) ? DateFormats.timeWithSeconds : DateFormats.timeStorage,\n formatsFrom: [\n DateFormats.datetimeStorage,\n DateFormats.datetimeDefault,\n DateFormats.timeWithSeconds,\n DateFormats.timeStorage,\n ],\n timezoneOffset,\n })\n },\n}\n\nconst toNodeValue = (params: ToNodeValueParams): Promise<any> => {\n const { nodeDef, valueExpr } = params\n if (Objects.isEmpty(valueExpr)) return Promise.resolve(null)\n\n const fn = _valueExprToValueNodeFns[NodeDefs.getType(nodeDef)]\n return Promise.resolve(fn?.(params))\n}\n\nexport const RecordExpressionValueConverter = {\n toNodeValue,\n}\n"]}
@@ -72,7 +72,7 @@ const updateDescendantsApplicability = ({ updateResult, nodeCtxChild, applicable
72
72
  const userValueCleared = nodeDescendantCleared && !nodeDef_1.NodeDefs.isReadOnly(nodeDescendantDef) && node_1.Nodes.hasUserInputValue(nodeDescendant);
73
73
  // Clear value if becoming non-applicable and parameter is enabled
74
74
  const nodeDescendantUpdated = nodeDescendantCleared
75
- ? node_1.Nodes.assocValue(nodeDescendant, null, sideEffect)
75
+ ? node_1.Nodes.assocValue(nodeDescendant, null, { sideEffect })
76
76
  : nodeDescendant;
77
77
  updateResult.addNode(nodeDescendantUpdated, recordUpdateOptions);
78
78
  if (userValueCleared) {