@openforis/arena-core 2.15.0 → 2.16.1

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 (74) hide show
  1. package/dist/error/systemErrorKeys.d.ts +1 -0
  2. package/dist/error/systemErrorKeys.js +1 -0
  3. package/dist/error/systemErrorKeys.js.map +1 -1
  4. package/dist/esm/error/systemErrorKeys.js +1 -0
  5. package/dist/esm/error/systemErrorKeys.js.map +1 -1
  6. package/dist/esm/expression/javascript/global.js +3 -1
  7. package/dist/esm/expression/javascript/global.js.map +1 -1
  8. package/dist/esm/expression/javascript/node/identifier.js +4 -1
  9. package/dist/esm/expression/javascript/node/identifier.js.map +1 -1
  10. package/dist/esm/geo/areaOfInterest.js.map +1 -1
  11. package/dist/esm/geo/index.js.map +1 -1
  12. package/dist/esm/index.js.map +1 -1
  13. package/dist/esm/nodeDefExpressionEvaluator/areaOfInterestProvider.js +2 -0
  14. package/dist/esm/nodeDefExpressionEvaluator/areaOfInterestProvider.js.map +1 -0
  15. package/dist/esm/nodeDefExpressionEvaluator/context.js.map +1 -1
  16. package/dist/esm/nodeDefExpressionEvaluator/functions.js +45 -8
  17. package/dist/esm/nodeDefExpressionEvaluator/functions.js.map +1 -1
  18. package/dist/esm/nodeDefExpressionEvaluator/index.js.map +1 -1
  19. package/dist/esm/nodeDefExpressionEvaluator/node/identifier.js +4 -1
  20. package/dist/esm/nodeDefExpressionEvaluator/node/identifier.js.map +1 -1
  21. package/dist/esm/record/recordExpressionEvaluator/context.js.map +1 -1
  22. package/dist/esm/record/recordExpressionEvaluator/node/identifier/identifier.js +4 -0
  23. package/dist/esm/record/recordExpressionEvaluator/node/identifier/identifier.js.map +1 -1
  24. package/dist/esm/record/recordExpressionEvaluator/recordExpressionEvaluator.js.map +1 -1
  25. package/dist/esm/record/recordNodesUpdater/recordExpressionEvaluationContext.js.map +1 -1
  26. package/dist/esm/record/recordValidator/attributeValidator.js +2 -1
  27. package/dist/esm/record/recordValidator/attributeValidator.js.map +1 -1
  28. package/dist/esm/survey/survey.js.map +1 -1
  29. package/dist/esm/survey/surveys/index.js +3 -2
  30. package/dist/esm/survey/surveys/index.js.map +1 -1
  31. package/dist/esm/survey/surveys/surveysGetters.js +3 -2
  32. package/dist/esm/survey/surveys/surveysGetters.js.map +1 -1
  33. package/dist/expression/javascript/global.d.ts +1 -0
  34. package/dist/expression/javascript/global.js +5 -2
  35. package/dist/expression/javascript/global.js.map +1 -1
  36. package/dist/expression/javascript/node/identifier.js +3 -0
  37. package/dist/expression/javascript/node/identifier.js.map +1 -1
  38. package/dist/geo/areaOfInterest.d.ts +14 -1
  39. package/dist/geo/areaOfInterest.js.map +1 -1
  40. package/dist/geo/index.d.ts +1 -1
  41. package/dist/geo/index.js.map +1 -1
  42. package/dist/index.d.ts +2 -2
  43. package/dist/index.js.map +1 -1
  44. package/dist/nodeDefExpressionEvaluator/areaOfInterestProvider.d.ts +11 -0
  45. package/dist/nodeDefExpressionEvaluator/areaOfInterestProvider.js +3 -0
  46. package/dist/nodeDefExpressionEvaluator/areaOfInterestProvider.js.map +1 -0
  47. package/dist/nodeDefExpressionEvaluator/context.d.ts +2 -0
  48. package/dist/nodeDefExpressionEvaluator/context.js.map +1 -1
  49. package/dist/nodeDefExpressionEvaluator/functions.js +44 -7
  50. package/dist/nodeDefExpressionEvaluator/functions.js.map +1 -1
  51. package/dist/nodeDefExpressionEvaluator/index.d.ts +1 -0
  52. package/dist/nodeDefExpressionEvaluator/index.js.map +1 -1
  53. package/dist/nodeDefExpressionEvaluator/node/identifier.js +3 -0
  54. package/dist/nodeDefExpressionEvaluator/node/identifier.js.map +1 -1
  55. package/dist/record/recordExpressionEvaluator/context.d.ts +2 -0
  56. package/dist/record/recordExpressionEvaluator/context.js.map +1 -1
  57. package/dist/record/recordExpressionEvaluator/node/identifier/identifier.js +4 -0
  58. package/dist/record/recordExpressionEvaluator/node/identifier/identifier.js.map +1 -1
  59. package/dist/record/recordExpressionEvaluator/recordExpressionEvaluator.d.ts +2 -0
  60. package/dist/record/recordExpressionEvaluator/recordExpressionEvaluator.js.map +1 -1
  61. package/dist/record/recordNodesUpdater/recordExpressionEvaluationContext.d.ts +2 -0
  62. package/dist/record/recordNodesUpdater/recordExpressionEvaluationContext.js.map +1 -1
  63. package/dist/record/recordValidator/attributeValidator.d.ts +2 -0
  64. package/dist/record/recordValidator/attributeValidator.js +2 -1
  65. package/dist/record/recordValidator/attributeValidator.js.map +1 -1
  66. package/dist/survey/survey.d.ts +2 -2
  67. package/dist/survey/survey.js.map +1 -1
  68. package/dist/survey/surveys/index.d.ts +3 -2
  69. package/dist/survey/surveys/index.js +2 -1
  70. package/dist/survey/surveys/index.js.map +1 -1
  71. package/dist/survey/surveys/surveysGetters.d.ts +6 -2
  72. package/dist/survey/surveys/surveysGetters.js +6 -4
  73. package/dist/survey/surveys/surveysGetters.js.map +1 -1
  74. package/package.json +1 -1
@@ -3,6 +3,7 @@ import { ExpressionContext } from '../expression';
3
3
  import { NodeDef } from '../nodeDef';
4
4
  import { NodeDefProps, NodeDefType } from '../nodeDef/nodeDef';
5
5
  import { Survey } from '../survey';
6
+ import { AreaOfInterestProvider } from './areaOfInterestProvider';
6
7
  import { CategoryItemProvider } from './categoryItemProvider';
7
8
  import { TaxonProvider } from './taxonProvider';
8
9
  export interface NodeDefExpressionContext extends ExpressionContext {
@@ -19,4 +20,5 @@ export interface NodeDefExpressionContext extends ExpressionContext {
19
20
  memberProperty?: boolean;
20
21
  categoryItemProvider?: CategoryItemProvider;
21
22
  taxonProvider?: TaxonProvider;
23
+ areaOfInterestProvider?: AreaOfInterestProvider;
22
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/nodeDefExpressionEvaluator/context.ts"],"names":[],"mappings":"","sourcesContent":["import { User } from '../auth'\nimport { ExpressionContext } from '../expression'\nimport { NodeDef } from '../nodeDef'\nimport { NodeDefProps, NodeDefType } from '../nodeDef/nodeDef'\nimport { Survey } from '../survey'\nimport { CategoryItemProvider } from './categoryItemProvider'\nimport { TaxonProvider } from './taxonProvider'\n\nexport interface NodeDefExpressionContext extends ExpressionContext {\n survey: Survey\n user?: User\n nodeDefCurrent: NodeDef<NodeDefType, NodeDefProps>\n nodeDefContext?: NodeDef<NodeDefType, NodeDefProps>\n /**\n * Unique UUIDs of node definitions being visited during expression evaluation.\n */\n referencedNodeDefUuids?: Set<string>\n selfReferenceAllowed?: boolean\n // true when the expression is used to filter code or taxon items\n itemsFilter?: boolean\n // true when evaluating the property of a member expression (e.g. \"length\" in \"text_attr.length\")\n memberProperty?: boolean\n\n categoryItemProvider?: CategoryItemProvider\n taxonProvider?: TaxonProvider\n}\n"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/nodeDefExpressionEvaluator/context.ts"],"names":[],"mappings":"","sourcesContent":["import { User } from '../auth'\nimport { ExpressionContext } from '../expression'\nimport { NodeDef } from '../nodeDef'\nimport { NodeDefProps, NodeDefType } from '../nodeDef/nodeDef'\nimport { Survey } from '../survey'\nimport { AreaOfInterestProvider } from './areaOfInterestProvider'\nimport { CategoryItemProvider } from './categoryItemProvider'\nimport { TaxonProvider } from './taxonProvider'\n\nexport interface NodeDefExpressionContext extends ExpressionContext {\n survey: Survey\n user?: User\n nodeDefCurrent: NodeDef<NodeDefType, NodeDefProps>\n nodeDefContext?: NodeDef<NodeDefType, NodeDefProps>\n /**\n * Unique UUIDs of node definitions being visited during expression evaluation.\n */\n referencedNodeDefUuids?: Set<string>\n selfReferenceAllowed?: boolean\n // true when the expression is used to filter code or taxon items\n itemsFilter?: boolean\n // true when evaluating the property of a member expression (e.g. \"length\" in \"text_attr.length\")\n memberProperty?: boolean\n\n categoryItemProvider?: CategoryItemProvider\n taxonProvider?: TaxonProvider\n areaOfInterestProvider?: AreaOfInterestProvider\n}\n"]}
@@ -68,6 +68,28 @@ const getOrFetchTaxon = (params) => __awaiter(void 0, void 0, void 0, function*
68
68
  const draft = !record || !!record.preview;
69
69
  return taxon !== null && taxon !== void 0 ? taxon : taxonProvider === null || taxonProvider === void 0 ? void 0 : taxonProvider.getTaxonByCode({ survey, taxonomyUuid, taxonCode, draft });
70
70
  });
71
+ const fetchAreaOfInterest = (params) => __awaiter(void 0, void 0, void 0, function* () {
72
+ const { context, name } = params;
73
+ const { survey, areaOfInterestProvider } = context;
74
+ if (!areaOfInterestProvider || !(0, surveysGetters_1.getAreaOfInterestByName)({ survey, name }))
75
+ return undefined;
76
+ return areaOfInterestProvider.getAreaOfInterest({ survey, name });
77
+ });
78
+ // expression validation (no record): a literal area name must be defined in the survey
79
+ const validateAreaOfInterestName = (params) => {
80
+ const { context, name } = params;
81
+ const record = context.record;
82
+ if (!record && typeof name === 'string' && !(0, surveysGetters_1.getAreaOfInterestByName)({ survey: context.survey, name })) {
83
+ throw new error_1.SystemError(error_1.SystemErrorKeys.expression.areaOfInterestNotFound, { name });
84
+ }
85
+ };
86
+ const distanceToAreaOfInterestBoundary = (params) => __awaiter(void 0, void 0, void 0, function* () {
87
+ const { context, point, name } = params;
88
+ const areaOfInterest = yield fetchAreaOfInterest({ context, name });
89
+ if (!areaOfInterest)
90
+ return null;
91
+ return geo_1.Points.distanceToPolygonBoundary(point, areaOfInterest, (0, surveysGetters_1.getSRSIndex)(context.survey));
92
+ });
71
93
  const geoDistanceExecutor = (context) => (coordinateFrom, coordinateTo) => {
72
94
  const { survey } = context;
73
95
  const srsIndex = (0, surveysGetters_1.getSRSIndex)(survey);
@@ -149,17 +171,32 @@ exports.nodeDefExpressionFunctions = {
149
171
  },
150
172
  },
151
173
  geoDistance: { minArity: 2, maxArity: 2, executor: geoDistanceExecutor },
152
- geoDistanceToAOIBoundary: {
174
+ geoAOIContaining: {
153
175
  minArity: 1,
154
176
  maxArity: 1,
155
- executor: (context) => (coordinate) => {
156
- const { survey } = context;
157
- const areaOfInterest = (0, surveysGetters_1.getAreaOfInterest)(survey);
177
+ executor: (context) => (coordinate) => __awaiter(void 0, void 0, void 0, function* () {
158
178
  const point = geo_1.Points.parse(coordinate);
159
- if (!areaOfInterest || !point)
179
+ if (!point || !context.areaOfInterestProvider)
160
180
  return null;
161
- return geo_1.Points.distanceToPolygonBoundary(point, areaOfInterest, (0, surveysGetters_1.getSRSIndex)(survey));
162
- },
181
+ // the survey order is the priority of overlapping areas
182
+ for (const { name } of (0, surveysGetters_1.getAreasOfInterest)(context.survey)) {
183
+ const distance = yield distanceToAreaOfInterestBoundary({ context, point, name }); // NOSONAR
184
+ if (distance !== null && distance <= 0)
185
+ return name;
186
+ }
187
+ return null;
188
+ }),
189
+ },
190
+ geoDistanceToAOIBoundary: {
191
+ minArity: 2,
192
+ maxArity: 2,
193
+ executor: (context) => (coordinate, name) => __awaiter(void 0, void 0, void 0, function* () {
194
+ validateAreaOfInterestName({ context, name });
195
+ const point = geo_1.Points.parse(coordinate);
196
+ if (!point || typeof name !== 'string')
197
+ return null;
198
+ return distanceToAreaOfInterestBoundary({ context, point, name });
199
+ }),
163
200
  },
164
201
  geoPolygon: {
165
202
  minArity: 1,
@@ -1 +1 @@
1
- {"version":3,"file":"functions.js","sourceRoot":"","sources":["../../src/nodeDefExpressionEvaluator/functions.ts"],"names":[],"mappings":"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","sourcesContent":["import { Users } from '../auth'\nimport { CategoryItem } from '../category'\nimport { SystemError, SystemErrorKeys } from '../error'\nimport { ExpressionFunctions } from '../expression'\nimport { ExtraProps } from '../extraProp/extraProps'\nimport { Point, Points } from '../geo'\nimport { LanguagesISO639part2 } from '../language'\nimport { ArenaRecord } from '../record'\nimport { getNodeDefParent } from '../survey/surveys/nodeDefs'\nimport { getCategoryItemByCodePaths, getTaxonByCode } from '../survey/surveys/refsData'\nimport { getAreaOfInterest, getCategoryByName, getSRSIndex, getTaxonomyByName } from '../survey/surveys/surveysGetters'\nimport { Taxon } from '../taxonomy'\nimport { Dates, Numbers, Objects } from '../utils'\nimport { NodeDefExpressionContext } from './context'\n\nconst sampleGeoJsonPolygon = {\n type: 'Feature',\n geometry: {\n type: 'Polygon',\n coordinates: [\n [\n [100.0, 0.0],\n [101.0, 0.0],\n [101.0, 1.0],\n [100.0, 1.0],\n [100.0, 0.0],\n ],\n ],\n },\n}\n\nconst isNotValidString = (value: string): boolean => Objects.isEmpty(value) || typeof value !== 'string'\n\nconst emptyExecutor = (_context: NodeDefExpressionContext) => () => null\n\nconst isUsingDraftProps = (context: NodeDefExpressionContext) => {\n // use draft props when validating expression or previewing record\n const record: ArenaRecord = (context as any).record\n return !record || !!record.preview\n}\n\nconst getOrFetchCategoryItem = async (params: {\n context: NodeDefExpressionContext\n categoryUuid: string\n codePaths: string[]\n}): Promise<CategoryItem | undefined> => {\n const { context, categoryUuid, codePaths } = params\n // if any code path is empty, return null (no category item can be found)\n if (Objects.isEmpty(codePaths) || codePaths.some(Objects.isEmpty)) {\n return undefined\n }\n const { survey, categoryItemProvider } = context\n const categoryItem = getCategoryItemByCodePaths({ survey, categoryUuid, codePaths })\n const draft = isUsingDraftProps(context)\n return categoryItem ?? categoryItemProvider?.getItemByCodePaths({ survey, categoryUuid, codePaths, draft })\n}\n\nconst getOrFetchTaxon = async (params: {\n context: NodeDefExpressionContext\n taxonomyUuid: string\n taxonCode: string\n}): Promise<Taxon | undefined> => {\n const { context, taxonomyUuid, taxonCode } = params\n if (typeof taxonCode !== 'string' && typeof taxonCode !== 'number') {\n return undefined // node def expression validator could call it passing a node def object\n }\n // if taxonCode is empty, return undefined\n if (Objects.isEmpty(taxonCode)) {\n return undefined\n }\n const { survey, taxonProvider } = context\n const taxon = getTaxonByCode({ survey, taxonomyUuid, taxonCode })\n // fetch draft props when validating expression or previewing record\n const record: ArenaRecord = (context as any).record\n const draft = !record || !!record.preview\n return taxon ?? taxonProvider?.getTaxonByCode({ survey, taxonomyUuid, taxonCode, draft })\n}\n\nconst geoDistanceExecutor =\n (context: NodeDefExpressionContext) =>\n (coordinateFrom: Point | string, coordinateTo: Point | string): number | null => {\n const { survey } = context\n const srsIndex = getSRSIndex(survey)\n\n const pointFrom = Points.parse(coordinateFrom)\n const pointTo = Points.parse(coordinateTo)\n\n return pointFrom && pointTo ? Points.distance(pointFrom, pointTo, srsIndex) : null\n }\n\nexport const nodeDefExpressionFunctions: ExpressionFunctions<NodeDefExpressionContext> = {\n categoryItemProp: {\n minArity: 3,\n executor:\n (context: NodeDefExpressionContext) =>\n async (categoryName: string, itemPropName: string, ...codePaths: string[]): Promise<any> => {\n const { survey } = context\n\n if (Objects.isEmpty(categoryName) || Objects.isEmpty(itemPropName) || Objects.isEmpty(codePaths))\n throw new SystemError(SystemErrorKeys.expression.missingFunctionParameters)\n\n const category = getCategoryByName({ survey, categoryName })\n if (!category) throw new SystemError(SystemErrorKeys.expression.invalidCategoryName, { name: categoryName })\n\n const extraPropDef = category.props.itemExtraDef?.[itemPropName]\n if (!extraPropDef)\n throw new SystemError(SystemErrorKeys.expression.invalidCategoryExtraProp, { propName: itemPropName })\n\n const { uuid: categoryUuid } = category\n const categoryItem = await getOrFetchCategoryItem({ context, categoryUuid, codePaths })\n if (!categoryItem) return null\n\n const value = categoryItem.props.extra?.[itemPropName]\n return ExtraProps.convertValue({ survey, extraPropDef, value })\n },\n },\n count: {\n minArity: 1,\n maxArity: 1,\n executor:\n (_context: NodeDefExpressionContext) =>\n (_nodeSet): number =>\n 1,\n },\n dateTimeDiff: {\n minArity: 4,\n maxArity: 4,\n executor:\n (_context: NodeDefExpressionContext) =>\n (date1: string, time1: string, date2: string, time2: string): number | null => {\n if (isNotValidString(date1) || isNotValidString(time1) || isNotValidString(date2) || isNotValidString(time2))\n return null\n const [hours1, minutes1] = time1.split(':')\n const [hours2, minutes2] = time2.split(':')\n let dt1 = Dates.addHours(date1, Number(hours1))\n dt1 = Dates.addMinutes(dt1, Number(minutes1))\n let dt2 = Dates.addHours(date2, Number(hours2))\n dt2 = Dates.addMinutes(dt2, Number(minutes2))\n return Dates.diffInMinutes(dt1, dt2)\n },\n },\n // deprecated, use geoDistance instead\n distance: { minArity: 2, maxArity: 2, executor: geoDistanceExecutor },\n first: {\n minArity: 1,\n maxArity: 1,\n evaluateArgsToNodes: true,\n executor: emptyExecutor,\n },\n geoCoordinateAtDistance: {\n minArity: 3,\n maxArity: 3,\n executor:\n (context: NodeDefExpressionContext) =>\n (coordinate: Point | string, distanceMeters: number, bearingDeg: number): Point | null => {\n // validate parameters\n const origin = Points.parse(coordinate)\n if (!origin) return null\n\n const distanceMetersNumber = Number(distanceMeters)\n const bearingDegNumber = Number(bearingDeg)\n if (!Number.isFinite(distanceMetersNumber) || distanceMetersNumber < 0 || !Number.isFinite(bearingDegNumber)) {\n return null\n }\n\n const { survey } = context\n const srsIndex = getSRSIndex(survey)\n\n return Points.pointAtDistance({\n origin,\n distanceMeters: distanceMetersNumber,\n bearingDeg: bearingDegNumber,\n srsIndex,\n })\n },\n },\n geoDistance: { minArity: 2, maxArity: 2, executor: geoDistanceExecutor },\n geoDistanceToAOIBoundary: {\n minArity: 1,\n maxArity: 1,\n executor:\n (context: NodeDefExpressionContext) =>\n (coordinate: Point | string): number | null => {\n const { survey } = context\n const areaOfInterest = getAreaOfInterest(survey)\n const point = Points.parse(coordinate)\n if (!areaOfInterest || !point) return null\n return Points.distanceToPolygonBoundary(point, areaOfInterest, getSRSIndex(survey))\n },\n },\n geoPolygon: {\n minArity: 1,\n evaluateArgsToNodes: true,\n executor: () => () => sampleGeoJsonPolygon,\n },\n includes: {\n minArity: 2,\n maxArity: 2,\n evaluateArgsToNodes: false,\n executor:\n () =>\n (items: any, value: any): boolean =>\n Array.isArray(items) && items.map(String).includes(String(value)),\n },\n index: {\n minArity: 1,\n maxArity: 1,\n evaluateArgsToNodes: true,\n executor: () => () => -1,\n },\n last: {\n minArity: 1,\n maxArity: 1,\n evaluateArgsToNodes: true,\n executor: emptyExecutor,\n },\n now: {\n minArity: 0,\n maxArity: 0,\n evaluateToNode: false,\n executor: () => () => Dates.nowFormattedForStorage(),\n },\n numberToWords: {\n minArity: 1,\n maxArity: 1,\n evaluateArgsToNodes: false,\n executor:\n (context: NodeDefExpressionContext) =>\n (value: any): string | null => {\n if (Objects.isEmpty(value)) return null\n return Numbers.toWords(value, context.lang)\n },\n },\n parent: {\n minArity: 1,\n maxArity: 1,\n evaluateArgsToNodes: true,\n evaluateToNode: true,\n executor: (context: NodeDefExpressionContext) => (nodeDef) => {\n const { survey } = context\n return getNodeDefParent({ survey, nodeDef })\n },\n },\n prevCycleValue: {\n minArity: 1,\n maxArity: 1,\n executor: emptyExecutor,\n },\n prevCycleValues: {\n minArity: 1,\n maxArity: 1,\n executor: emptyExecutor,\n },\n recordCycle: {\n minArity: 0,\n maxArity: 0,\n executor: emptyExecutor,\n },\n recordDateCreated: {\n minArity: 0,\n maxArity: 0,\n executor: emptyExecutor,\n },\n recordDateLastModified: {\n minArity: 0,\n maxArity: 0,\n executor: emptyExecutor,\n },\n recordOwnerEmail: {\n minArity: 0,\n maxArity: 0,\n executor: emptyExecutor,\n },\n recordOwnerName: {\n minArity: 0,\n maxArity: 0,\n executor: emptyExecutor,\n },\n recordOwnerRole: {\n minArity: 0,\n maxArity: 0,\n executor: emptyExecutor,\n },\n sum: {\n minArity: 1,\n maxArity: 1,\n evaluateArgsToNodes: true,\n executor: (_context: NodeDefExpressionContext) => (_nodeSet) => 1,\n },\n taxonProp: {\n minArity: 3,\n maxArity: 3,\n executor:\n (context: NodeDefExpressionContext) => async (taxonomyName: string, propName: string, taxonCode: string) => {\n if (Objects.isEmpty(taxonomyName) || Objects.isEmpty(propName))\n throw new SystemError(SystemErrorKeys.expression.missingFunctionParameters)\n if (Objects.isEmpty(taxonCode)) return null\n\n const { survey } = context\n const taxonomy = getTaxonomyByName({ survey, taxonomyName })\n if (!taxonomy) throw new SystemError(SystemErrorKeys.expression.invalidTaxonomyName, { name: taxonomyName })\n\n const extraPropDef = taxonomy.props.extraPropsDefs?.[propName]\n if (!extraPropDef) throw new SystemError(SystemErrorKeys.expression.invalidTaxonomyExtraProp, { propName })\n\n const taxon = await getOrFetchTaxon({ context, taxonomyUuid: taxonomy.uuid, taxonCode })\n if (!taxon) return null\n\n const value = taxon.props.extra?.[propName]\n return ExtraProps.convertValue({ survey, extraPropDef, value })\n },\n },\n taxonVernacularName: {\n minArity: 3,\n maxArity: 3,\n executor:\n (context: NodeDefExpressionContext) =>\n async (taxonomyName: string, vernacularLangCode: string, taxonCode: string) => {\n if (Objects.isEmpty(taxonomyName) || Objects.isEmpty(vernacularLangCode))\n throw new SystemError(SystemErrorKeys.expression.missingFunctionParameters)\n if (Objects.isEmpty(taxonCode)) return null\n\n const { survey } = context\n const taxonomy = getTaxonomyByName({ survey, taxonomyName })\n if (!taxonomy) throw new SystemError(SystemErrorKeys.expression.invalidTaxonomyName, { name: taxonomyName })\n\n if (!LanguagesISO639part2[vernacularLangCode]) {\n throw new SystemError(SystemErrorKeys.expression.invalidTaxonVernacularNameLanguageCode, {\n vernacularLangCode,\n })\n }\n\n const taxon = await getOrFetchTaxon({ context, taxonomyUuid: taxonomy.uuid, taxonCode })\n if (!taxon) return null\n\n const vernacularNameArray = taxon.vernacularNames?.[vernacularLangCode]\n // consider first vernacular name object only\n const firstVernacularName = vernacularNameArray?.[0]\n return firstVernacularName?.props?.name\n },\n },\n unique: {\n minArity: 1,\n maxArity: 1,\n evaluateArgsToNodes: true,\n executor: (_context: NodeDefExpressionContext) => (_nodeSet) => [],\n },\n userEmail: {\n minArity: 0,\n maxArity: 0,\n executor: (context: NodeDefExpressionContext) => () => context.user?.email,\n },\n userIsRecordOwner: {\n minArity: 0,\n maxArity: 0,\n executor: (_context: NodeDefExpressionContext) => () => false,\n },\n userName: {\n minArity: 0,\n maxArity: 0,\n executor: (context: NodeDefExpressionContext) => () => context.user?.name,\n },\n userProp: {\n minArity: 1,\n maxArity: 1,\n executor: (context: NodeDefExpressionContext) => (propName: string) => {\n const { user, survey } = context\n if (!survey || !user) return undefined\n const { uuid: surveyUuid } = survey\n const combinedExtraProps = Users.getCombinedExtraProps(surveyUuid)(user)\n return combinedExtraProps[propName]\n },\n },\n}\n"]}
1
+ {"version":3,"file":"functions.js","sourceRoot":"","sources":["../../src/nodeDefExpressionEvaluator/functions.ts"],"names":[],"mappings":"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","sourcesContent":["import { Users } from '../auth'\nimport { CategoryItem } from '../category'\nimport { SystemError, SystemErrorKeys } from '../error'\nimport { ExpressionFunctions } from '../expression'\nimport { ExtraProps } from '../extraProp/extraProps'\nimport { AreaOfInterest, Point, Points } from '../geo'\nimport { LanguagesISO639part2 } from '../language'\nimport { ArenaRecord } from '../record'\nimport { getNodeDefParent } from '../survey/surveys/nodeDefs'\nimport { getCategoryItemByCodePaths, getTaxonByCode } from '../survey/surveys/refsData'\nimport {\n getAreaOfInterestByName,\n getAreasOfInterest,\n getCategoryByName,\n getSRSIndex,\n getTaxonomyByName,\n} from '../survey/surveys/surveysGetters'\nimport { Taxon } from '../taxonomy'\nimport { Dates, Numbers, Objects } from '../utils'\nimport { NodeDefExpressionContext } from './context'\n\nconst sampleGeoJsonPolygon = {\n type: 'Feature',\n geometry: {\n type: 'Polygon',\n coordinates: [\n [\n [100.0, 0.0],\n [101.0, 0.0],\n [101.0, 1.0],\n [100.0, 1.0],\n [100.0, 0.0],\n ],\n ],\n },\n}\n\nconst isNotValidString = (value: string): boolean => Objects.isEmpty(value) || typeof value !== 'string'\n\nconst emptyExecutor = (_context: NodeDefExpressionContext) => () => null\n\nconst isUsingDraftProps = (context: NodeDefExpressionContext) => {\n // use draft props when validating expression or previewing record\n const record: ArenaRecord = (context as any).record\n return !record || !!record.preview\n}\n\nconst getOrFetchCategoryItem = async (params: {\n context: NodeDefExpressionContext\n categoryUuid: string\n codePaths: string[]\n}): Promise<CategoryItem | undefined> => {\n const { context, categoryUuid, codePaths } = params\n // if any code path is empty, return null (no category item can be found)\n if (Objects.isEmpty(codePaths) || codePaths.some(Objects.isEmpty)) {\n return undefined\n }\n const { survey, categoryItemProvider } = context\n const categoryItem = getCategoryItemByCodePaths({ survey, categoryUuid, codePaths })\n const draft = isUsingDraftProps(context)\n return categoryItem ?? categoryItemProvider?.getItemByCodePaths({ survey, categoryUuid, codePaths, draft })\n}\n\nconst getOrFetchTaxon = async (params: {\n context: NodeDefExpressionContext\n taxonomyUuid: string\n taxonCode: string\n}): Promise<Taxon | undefined> => {\n const { context, taxonomyUuid, taxonCode } = params\n if (typeof taxonCode !== 'string' && typeof taxonCode !== 'number') {\n return undefined // node def expression validator could call it passing a node def object\n }\n // if taxonCode is empty, return undefined\n if (Objects.isEmpty(taxonCode)) {\n return undefined\n }\n const { survey, taxonProvider } = context\n const taxon = getTaxonByCode({ survey, taxonomyUuid, taxonCode })\n // fetch draft props when validating expression or previewing record\n const record: ArenaRecord = (context as any).record\n const draft = !record || !!record.preview\n return taxon ?? taxonProvider?.getTaxonByCode({ survey, taxonomyUuid, taxonCode, draft })\n}\n\nconst fetchAreaOfInterest = async (params: {\n context: NodeDefExpressionContext\n name: string\n}): Promise<AreaOfInterest | undefined> => {\n const { context, name } = params\n const { survey, areaOfInterestProvider } = context\n if (!areaOfInterestProvider || !getAreaOfInterestByName({ survey, name })) return undefined\n return areaOfInterestProvider.getAreaOfInterest({ survey, name })\n}\n\n// expression validation (no record): a literal area name must be defined in the survey\nconst validateAreaOfInterestName = (params: { context: NodeDefExpressionContext; name: unknown }): void => {\n const { context, name } = params\n const record: ArenaRecord = (context as any).record\n if (!record && typeof name === 'string' && !getAreaOfInterestByName({ survey: context.survey, name })) {\n throw new SystemError(SystemErrorKeys.expression.areaOfInterestNotFound, { name })\n }\n}\n\nconst distanceToAreaOfInterestBoundary = async (params: {\n context: NodeDefExpressionContext\n point: Point\n name: string\n}): Promise<number | null> => {\n const { context, point, name } = params\n const areaOfInterest = await fetchAreaOfInterest({ context, name })\n if (!areaOfInterest) return null\n return Points.distanceToPolygonBoundary(point, areaOfInterest, getSRSIndex(context.survey))\n}\n\nconst geoDistanceExecutor =\n (context: NodeDefExpressionContext) =>\n (coordinateFrom: Point | string, coordinateTo: Point | string): number | null => {\n const { survey } = context\n const srsIndex = getSRSIndex(survey)\n\n const pointFrom = Points.parse(coordinateFrom)\n const pointTo = Points.parse(coordinateTo)\n\n return pointFrom && pointTo ? Points.distance(pointFrom, pointTo, srsIndex) : null\n }\n\nexport const nodeDefExpressionFunctions: ExpressionFunctions<NodeDefExpressionContext> = {\n categoryItemProp: {\n minArity: 3,\n executor:\n (context: NodeDefExpressionContext) =>\n async (categoryName: string, itemPropName: string, ...codePaths: string[]): Promise<any> => {\n const { survey } = context\n\n if (Objects.isEmpty(categoryName) || Objects.isEmpty(itemPropName) || Objects.isEmpty(codePaths))\n throw new SystemError(SystemErrorKeys.expression.missingFunctionParameters)\n\n const category = getCategoryByName({ survey, categoryName })\n if (!category) throw new SystemError(SystemErrorKeys.expression.invalidCategoryName, { name: categoryName })\n\n const extraPropDef = category.props.itemExtraDef?.[itemPropName]\n if (!extraPropDef)\n throw new SystemError(SystemErrorKeys.expression.invalidCategoryExtraProp, { propName: itemPropName })\n\n const { uuid: categoryUuid } = category\n const categoryItem = await getOrFetchCategoryItem({ context, categoryUuid, codePaths })\n if (!categoryItem) return null\n\n const value = categoryItem.props.extra?.[itemPropName]\n return ExtraProps.convertValue({ survey, extraPropDef, value })\n },\n },\n count: {\n minArity: 1,\n maxArity: 1,\n executor:\n (_context: NodeDefExpressionContext) =>\n (_nodeSet): number =>\n 1,\n },\n dateTimeDiff: {\n minArity: 4,\n maxArity: 4,\n executor:\n (_context: NodeDefExpressionContext) =>\n (date1: string, time1: string, date2: string, time2: string): number | null => {\n if (isNotValidString(date1) || isNotValidString(time1) || isNotValidString(date2) || isNotValidString(time2))\n return null\n const [hours1, minutes1] = time1.split(':')\n const [hours2, minutes2] = time2.split(':')\n let dt1 = Dates.addHours(date1, Number(hours1))\n dt1 = Dates.addMinutes(dt1, Number(minutes1))\n let dt2 = Dates.addHours(date2, Number(hours2))\n dt2 = Dates.addMinutes(dt2, Number(minutes2))\n return Dates.diffInMinutes(dt1, dt2)\n },\n },\n // deprecated, use geoDistance instead\n distance: { minArity: 2, maxArity: 2, executor: geoDistanceExecutor },\n first: {\n minArity: 1,\n maxArity: 1,\n evaluateArgsToNodes: true,\n executor: emptyExecutor,\n },\n geoCoordinateAtDistance: {\n minArity: 3,\n maxArity: 3,\n executor:\n (context: NodeDefExpressionContext) =>\n (coordinate: Point | string, distanceMeters: number, bearingDeg: number): Point | null => {\n // validate parameters\n const origin = Points.parse(coordinate)\n if (!origin) return null\n\n const distanceMetersNumber = Number(distanceMeters)\n const bearingDegNumber = Number(bearingDeg)\n if (!Number.isFinite(distanceMetersNumber) || distanceMetersNumber < 0 || !Number.isFinite(bearingDegNumber)) {\n return null\n }\n\n const { survey } = context\n const srsIndex = getSRSIndex(survey)\n\n return Points.pointAtDistance({\n origin,\n distanceMeters: distanceMetersNumber,\n bearingDeg: bearingDegNumber,\n srsIndex,\n })\n },\n },\n geoDistance: { minArity: 2, maxArity: 2, executor: geoDistanceExecutor },\n geoAOIContaining: {\n minArity: 1,\n maxArity: 1,\n executor:\n (context: NodeDefExpressionContext) =>\n async (coordinate: Point | string): Promise<string | null> => {\n const point = Points.parse(coordinate)\n if (!point || !context.areaOfInterestProvider) return null\n // the survey order is the priority of overlapping areas\n for (const { name } of getAreasOfInterest(context.survey)) {\n const distance = await distanceToAreaOfInterestBoundary({ context, point, name }) // NOSONAR\n if (distance !== null && distance <= 0) return name\n }\n return null\n },\n },\n geoDistanceToAOIBoundary: {\n minArity: 2,\n maxArity: 2,\n executor:\n (context: NodeDefExpressionContext) =>\n async (coordinate: Point | string, name: string): Promise<number | null> => {\n validateAreaOfInterestName({ context, name })\n const point = Points.parse(coordinate)\n if (!point || typeof name !== 'string') return null\n return distanceToAreaOfInterestBoundary({ context, point, name })\n },\n },\n geoPolygon: {\n minArity: 1,\n evaluateArgsToNodes: true,\n executor: () => () => sampleGeoJsonPolygon,\n },\n includes: {\n minArity: 2,\n maxArity: 2,\n evaluateArgsToNodes: false,\n executor:\n () =>\n (items: any, value: any): boolean =>\n Array.isArray(items) && items.map(String).includes(String(value)),\n },\n index: {\n minArity: 1,\n maxArity: 1,\n evaluateArgsToNodes: true,\n executor: () => () => -1,\n },\n last: {\n minArity: 1,\n maxArity: 1,\n evaluateArgsToNodes: true,\n executor: emptyExecutor,\n },\n now: {\n minArity: 0,\n maxArity: 0,\n evaluateToNode: false,\n executor: () => () => Dates.nowFormattedForStorage(),\n },\n numberToWords: {\n minArity: 1,\n maxArity: 1,\n evaluateArgsToNodes: false,\n executor:\n (context: NodeDefExpressionContext) =>\n (value: any): string | null => {\n if (Objects.isEmpty(value)) return null\n return Numbers.toWords(value, context.lang)\n },\n },\n parent: {\n minArity: 1,\n maxArity: 1,\n evaluateArgsToNodes: true,\n evaluateToNode: true,\n executor: (context: NodeDefExpressionContext) => (nodeDef) => {\n const { survey } = context\n return getNodeDefParent({ survey, nodeDef })\n },\n },\n prevCycleValue: {\n minArity: 1,\n maxArity: 1,\n executor: emptyExecutor,\n },\n prevCycleValues: {\n minArity: 1,\n maxArity: 1,\n executor: emptyExecutor,\n },\n recordCycle: {\n minArity: 0,\n maxArity: 0,\n executor: emptyExecutor,\n },\n recordDateCreated: {\n minArity: 0,\n maxArity: 0,\n executor: emptyExecutor,\n },\n recordDateLastModified: {\n minArity: 0,\n maxArity: 0,\n executor: emptyExecutor,\n },\n recordOwnerEmail: {\n minArity: 0,\n maxArity: 0,\n executor: emptyExecutor,\n },\n recordOwnerName: {\n minArity: 0,\n maxArity: 0,\n executor: emptyExecutor,\n },\n recordOwnerRole: {\n minArity: 0,\n maxArity: 0,\n executor: emptyExecutor,\n },\n sum: {\n minArity: 1,\n maxArity: 1,\n evaluateArgsToNodes: true,\n executor: (_context: NodeDefExpressionContext) => (_nodeSet) => 1,\n },\n taxonProp: {\n minArity: 3,\n maxArity: 3,\n executor:\n (context: NodeDefExpressionContext) => async (taxonomyName: string, propName: string, taxonCode: string) => {\n if (Objects.isEmpty(taxonomyName) || Objects.isEmpty(propName))\n throw new SystemError(SystemErrorKeys.expression.missingFunctionParameters)\n if (Objects.isEmpty(taxonCode)) return null\n\n const { survey } = context\n const taxonomy = getTaxonomyByName({ survey, taxonomyName })\n if (!taxonomy) throw new SystemError(SystemErrorKeys.expression.invalidTaxonomyName, { name: taxonomyName })\n\n const extraPropDef = taxonomy.props.extraPropsDefs?.[propName]\n if (!extraPropDef) throw new SystemError(SystemErrorKeys.expression.invalidTaxonomyExtraProp, { propName })\n\n const taxon = await getOrFetchTaxon({ context, taxonomyUuid: taxonomy.uuid, taxonCode })\n if (!taxon) return null\n\n const value = taxon.props.extra?.[propName]\n return ExtraProps.convertValue({ survey, extraPropDef, value })\n },\n },\n taxonVernacularName: {\n minArity: 3,\n maxArity: 3,\n executor:\n (context: NodeDefExpressionContext) =>\n async (taxonomyName: string, vernacularLangCode: string, taxonCode: string) => {\n if (Objects.isEmpty(taxonomyName) || Objects.isEmpty(vernacularLangCode))\n throw new SystemError(SystemErrorKeys.expression.missingFunctionParameters)\n if (Objects.isEmpty(taxonCode)) return null\n\n const { survey } = context\n const taxonomy = getTaxonomyByName({ survey, taxonomyName })\n if (!taxonomy) throw new SystemError(SystemErrorKeys.expression.invalidTaxonomyName, { name: taxonomyName })\n\n if (!LanguagesISO639part2[vernacularLangCode]) {\n throw new SystemError(SystemErrorKeys.expression.invalidTaxonVernacularNameLanguageCode, {\n vernacularLangCode,\n })\n }\n\n const taxon = await getOrFetchTaxon({ context, taxonomyUuid: taxonomy.uuid, taxonCode })\n if (!taxon) return null\n\n const vernacularNameArray = taxon.vernacularNames?.[vernacularLangCode]\n // consider first vernacular name object only\n const firstVernacularName = vernacularNameArray?.[0]\n return firstVernacularName?.props?.name\n },\n },\n unique: {\n minArity: 1,\n maxArity: 1,\n evaluateArgsToNodes: true,\n executor: (_context: NodeDefExpressionContext) => (_nodeSet) => [],\n },\n userEmail: {\n minArity: 0,\n maxArity: 0,\n executor: (context: NodeDefExpressionContext) => () => context.user?.email,\n },\n userIsRecordOwner: {\n minArity: 0,\n maxArity: 0,\n executor: (_context: NodeDefExpressionContext) => () => false,\n },\n userName: {\n minArity: 0,\n maxArity: 0,\n executor: (context: NodeDefExpressionContext) => () => context.user?.name,\n },\n userProp: {\n minArity: 1,\n maxArity: 1,\n executor: (context: NodeDefExpressionContext) => (propName: string) => {\n const { user, survey } = context\n if (!survey || !user) return undefined\n const { uuid: surveyUuid } = survey\n const combinedExtraProps = Users.getCombinedExtraProps(surveyUuid)(user)\n return combinedExtraProps[propName]\n },\n },\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  export { NodeDefExpressionEvaluator } from './evaluator';
2
2
  export { NodeDefExpressionValidator } from './validator';
3
+ export type { AreaOfInterestProvider } from './areaOfInterestProvider';
3
4
  export type { CategoryItemProvider } from './categoryItemProvider';
4
5
  export type { TaxonProvider } from './taxonProvider';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nodeDefExpressionEvaluator/index.ts"],"names":[],"mappings":";;;AAAA,yCAAwD;AAA/C,uHAAA,0BAA0B,OAAA;AACnC,yCAAwD;AAA/C,uHAAA,0BAA0B,OAAA","sourcesContent":["export { NodeDefExpressionEvaluator } from './evaluator'\nexport { NodeDefExpressionValidator } from './validator'\nexport type { CategoryItemProvider } from './categoryItemProvider'\nexport type { TaxonProvider } from './taxonProvider'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nodeDefExpressionEvaluator/index.ts"],"names":[],"mappings":";;;AAAA,yCAAwD;AAA/C,uHAAA,0BAA0B,OAAA;AACnC,yCAAwD;AAA/C,uHAAA,0BAA0B,OAAA","sourcesContent":["export { NodeDefExpressionEvaluator } from './evaluator'\nexport { NodeDefExpressionValidator } from './validator'\nexport type { AreaOfInterestProvider } from './areaOfInterestProvider'\nexport type { CategoryItemProvider } from './categoryItemProvider'\nexport type { TaxonProvider } from './taxonProvider'\n"]}
@@ -45,6 +45,9 @@ class NodeDefIdentifierEvaluator extends identifier_1.IdentifierEvaluator {
45
45
  const { context } = this;
46
46
  const { nodeDefContext, object: objectContext, itemsFilter, memberProperty } = context;
47
47
  const { name: exprName } = expressionNode;
48
+ if ((0, global_1.isForbiddenPropertyName)(exprName)) {
49
+ this.throwIdentifierNotFound(expressionNode);
50
+ }
48
51
  if (exprName === expression_1.ExpressionVariable.CONTEXT) {
49
52
  if (nodeDefContext) {
50
53
  this.addReferencedNodeDefUuid(nodeDefContext.uuid);
@@ -1 +1 @@
1
- {"version":3,"file":"identifier.js","sourceRoot":"","sources":["../../../src/nodeDefExpressionEvaluator/node/identifier.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeDef, NodeDefProps, NodeDefType } from '../../nodeDef/nodeDef'\nimport { getNodeDefChildren, getNodeDefParent, getNodeDefSource } from '../../survey/surveys/nodeDefs'\nimport { NodeDefs } from '../../nodeDef/nodeDefs'\nimport { Objects, Queue } from '../../utils'\nimport { IdentifierEvaluator } from '../../expression/javascript/node/identifier'\nimport { getGlobalObjectProperty } from '../../expression/javascript/global'\nimport { NodeDefExpressionContext } from '../context'\nimport { ExpressionVariable, IdentifierExpression } from '../../expression'\nimport { SystemError, SystemErrorKeys } from '../../error'\nimport { ValidatorErrorKeys } from '../../validation'\nimport { NodeNativeProperties } from './nodeDefExpressionNativeProperties'\nimport { NodeValues } from '../../node/nodeValues'\n\n/**\n * Determines the actual context node def\n * - attribute def => parent entity def\n * - virtual entity def => source node def\n * - entity def => entity def itself\n */\nconst findActualContextNode = (params: {\n context: NodeDefExpressionContext\n}): NodeDef<NodeDefType, NodeDefProps> | undefined => {\n const { context } = params\n const { survey, object: nodeDefObjectContext } = context\n\n if (!nodeDefObjectContext) return undefined\n\n if (NodeDefs.isAttribute(nodeDefObjectContext)) {\n return getNodeDefParent({ survey, nodeDef: nodeDefObjectContext })\n }\n if (nodeDefObjectContext.virtual) {\n return getNodeDefSource({ survey, nodeDef: nodeDefObjectContext })\n }\n return nodeDefObjectContext\n}\n\nexport class NodeDefIdentifierEvaluator extends IdentifierEvaluator<NodeDefExpressionContext> {\n evaluate(expressionNode: IdentifierExpression): Promise<any> {\n try {\n return Promise.resolve(this.evaluateIdentifier(expressionNode))\n } catch (error) {\n return Promise.reject(error)\n }\n }\n\n private evaluateIdentifier(expressionNode: IdentifierExpression): any {\n const { context } = this\n const { nodeDefContext, object: objectContext, itemsFilter, memberProperty } = context\n const { name: exprName } = expressionNode\n\n if (exprName === ExpressionVariable.CONTEXT) {\n if (nodeDefContext) {\n this.addReferencedNodeDefUuid(nodeDefContext.uuid)\n }\n return nodeDefContext\n }\n\n // global objects (e.g. Math, String)\n const globalObjectProperty = getGlobalObjectProperty(exprName, objectContext)\n if (globalObjectProperty !== null) {\n return globalObjectProperty\n }\n\n if (itemsFilter) {\n const prop = objectContext?.props?.[exprName] ?? objectContext?.props?.extra?.[exprName]\n if (!Objects.isEmpty(prop)) {\n return prop\n }\n }\n\n // check if identifier is a composite attribute value prop\n if (NodeDefs.isAttribute(objectContext) && NodeValues.isValueProp({ nodeDef: objectContext, prop: exprName })) {\n return objectContext\n }\n\n if (memberProperty) {\n // property of a member expression (e.g. text_attr.length or text_attr.toUpperCase()): native properties first\n const nativeProperty = this.findNativeProperty(expressionNode)\n if (nativeProperty) return nativeProperty.value\n return this.getReferencedNodeDef(expressionNode)\n }\n // identifier not in a member expression: node defs first, so that node defs named like native properties\n // (e.g. \"name\", \"type\", \"trim\") are always found (and registered as dependencies)\n const referencedNodeDef = this.findReferencedNodeDef(expressionNode)\n if (referencedNodeDef) return referencedNodeDef\n\n const nativeProperty = this.findNativeProperty(expressionNode)\n if (nativeProperty) return nativeProperty.value\n\n return this.throwIdentifierNotFound(expressionNode)\n }\n\n /**\n * Finds the identifier among the native properties or functions of the context object\n * (e.g. String.length or String.toUpperCase()).\n */\n private findNativeProperty(expressionNode: IdentifierExpression): { value: any } | null {\n const { object: objectContext } = this.context\n const { name: exprName } = expressionNode\n\n const globalOrNativeProperty = this.findGlobalOrNativeProperty(expressionNode)\n if (globalOrNativeProperty) {\n return globalOrNativeProperty\n }\n if (NodeNativeProperties.hasNativeProperty({ nodeDefOrValue: objectContext, propName: exprName })) {\n return {\n value: NodeNativeProperties.evalNodeDefProperty({ nodeDefOrValue: objectContext, propName: exprName }),\n }\n }\n return null\n }\n\n private findReferencedNodeDef(expressionNode: IdentifierExpression): NodeDef<NodeDefType, NodeDefProps> | undefined {\n const { nodeDefCurrent, selfReferenceAllowed } = this.context\n const referencedNodeDef = this.findIdentifierAmongReachableNodeDefs(expressionNode)\n if (!referencedNodeDef) return undefined\n\n if (!selfReferenceAllowed && referencedNodeDef.uuid === nodeDefCurrent?.uuid) {\n throw new SystemError(ValidatorErrorKeys.expressions.cannotUseCurrentNode, { name: expressionNode.name })\n }\n this.addReferencedNodeDefUuid(referencedNodeDef.uuid)\n return referencedNodeDef\n }\n\n private getReferencedNodeDef(expressionNode: IdentifierExpression): NodeDef<NodeDefType, NodeDefProps> {\n return this.findReferencedNodeDef(expressionNode) ?? this.throwIdentifierNotFound(expressionNode)\n }\n\n private throwIdentifierNotFound(expressionNode: IdentifierExpression): never {\n throw new SystemError(SystemErrorKeys.expression.identifierNotFound, {\n name: expressionNode.name,\n contextObject: this.context.object?.props?.name,\n })\n }\n\n private addReferencedNodeDefUuid(uuid: string) {\n const { context } = this\n const { referencedNodeDefUuids = new Set() } = context\n context.referencedNodeDefUuids = referencedNodeDefUuids.add(uuid)\n }\n\n /**\n * Tries to find the specified identifier among the node defs that can be \"reached\" from the context node def.\n */\n protected findIdentifierAmongReachableNodeDefs(\n expressionNode: IdentifierExpression\n ): NodeDef<NodeDefType, NodeDefProps> | undefined {\n const { object: contextObject } = this.context\n\n if (!contextObject) return undefined\n\n // stop at the first match (same order as getReachableNodeDefs), without visiting all the reachable node defs\n for (const reachableNodeDef of this.iterateReachableNodeDefs()) {\n if (reachableNodeDef.props.name === expressionNode.name) {\n return reachableNodeDef\n }\n }\n return undefined\n }\n\n /**\n * Get reachable node defs, i.e. the children of the node definition's ancestors.\n * NOTE: The root node def is excluded, but it _should_ be an entity, so that is fine.\n */\n protected getReachableNodeDefs(): NodeDef<NodeDefType, NodeDefProps>[] {\n return Array.from(this.iterateReachableNodeDefs())\n }\n\n /**\n * Iterates over the reachable node defs (see getReachableNodeDefs), yielding every node def only once.\n */\n private *iterateReachableNodeDefs(): Generator<NodeDef<NodeDefType, NodeDefProps>> {\n const { context } = this\n const { survey, includeAnalysis } = context\n\n const reachableNodeDefUuids = new Set<string>()\n const visitedUuids = new Set<string>()\n\n const queue = new Queue<NodeDef<NodeDefType>>()\n\n const actualContextNode = findActualContextNode({ context })\n if (actualContextNode) {\n queue.enqueue(actualContextNode)\n reachableNodeDefUuids.add(actualContextNode.uuid)\n yield actualContextNode\n }\n\n while (!queue.isEmpty()) {\n const entityDefCurrent = queue.dequeue()!\n const entityDefCurrentChildren = getNodeDefChildren({ survey, nodeDef: entityDefCurrent, includeAnalysis })\n for (const childDef of entityDefCurrentChildren) {\n if (!reachableNodeDefUuids.has(childDef.uuid)) {\n reachableNodeDefUuids.add(childDef.uuid)\n yield childDef\n }\n }\n // visit nodes inside single entities\n queue.enqueueItems(entityDefCurrentChildren.filter(NodeDefs.isSingleEntity))\n\n // avoid visiting 2 times the same entity definition when traversing single entities\n if (!visitedUuids.has(entityDefCurrent.uuid)) {\n const entityDefCurrentParent = getNodeDefParent({ survey, nodeDef: entityDefCurrent })\n if (entityDefCurrentParent) {\n queue.enqueue(entityDefCurrentParent)\n }\n if (!reachableNodeDefUuids.has(entityDefCurrent.uuid)) {\n reachableNodeDefUuids.add(entityDefCurrent.uuid)\n yield entityDefCurrent\n }\n visitedUuids.add(entityDefCurrent.uuid)\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"identifier.js","sourceRoot":"","sources":["../../../src/nodeDefExpressionEvaluator/node/identifier.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeDef, NodeDefProps, NodeDefType } from '../../nodeDef/nodeDef'\nimport { getNodeDefChildren, getNodeDefParent, getNodeDefSource } from '../../survey/surveys/nodeDefs'\nimport { NodeDefs } from '../../nodeDef/nodeDefs'\nimport { Objects, Queue } from '../../utils'\nimport { IdentifierEvaluator } from '../../expression/javascript/node/identifier'\nimport { getGlobalObjectProperty, isForbiddenPropertyName } from '../../expression/javascript/global'\nimport { NodeDefExpressionContext } from '../context'\nimport { ExpressionVariable, IdentifierExpression } from '../../expression'\nimport { SystemError, SystemErrorKeys } from '../../error'\nimport { ValidatorErrorKeys } from '../../validation'\nimport { NodeNativeProperties } from './nodeDefExpressionNativeProperties'\nimport { NodeValues } from '../../node/nodeValues'\n\n/**\n * Determines the actual context node def\n * - attribute def => parent entity def\n * - virtual entity def => source node def\n * - entity def => entity def itself\n */\nconst findActualContextNode = (params: {\n context: NodeDefExpressionContext\n}): NodeDef<NodeDefType, NodeDefProps> | undefined => {\n const { context } = params\n const { survey, object: nodeDefObjectContext } = context\n\n if (!nodeDefObjectContext) return undefined\n\n if (NodeDefs.isAttribute(nodeDefObjectContext)) {\n return getNodeDefParent({ survey, nodeDef: nodeDefObjectContext })\n }\n if (nodeDefObjectContext.virtual) {\n return getNodeDefSource({ survey, nodeDef: nodeDefObjectContext })\n }\n return nodeDefObjectContext\n}\n\nexport class NodeDefIdentifierEvaluator extends IdentifierEvaluator<NodeDefExpressionContext> {\n evaluate(expressionNode: IdentifierExpression): Promise<any> {\n try {\n return Promise.resolve(this.evaluateIdentifier(expressionNode))\n } catch (error) {\n return Promise.reject(error)\n }\n }\n\n private evaluateIdentifier(expressionNode: IdentifierExpression): any {\n const { context } = this\n const { nodeDefContext, object: objectContext, itemsFilter, memberProperty } = context\n const { name: exprName } = expressionNode\n\n if (isForbiddenPropertyName(exprName)) {\n this.throwIdentifierNotFound(expressionNode)\n }\n\n if (exprName === ExpressionVariable.CONTEXT) {\n if (nodeDefContext) {\n this.addReferencedNodeDefUuid(nodeDefContext.uuid)\n }\n return nodeDefContext\n }\n\n // global objects (e.g. Math, String)\n const globalObjectProperty = getGlobalObjectProperty(exprName, objectContext)\n if (globalObjectProperty !== null) {\n return globalObjectProperty\n }\n\n if (itemsFilter) {\n const prop = objectContext?.props?.[exprName] ?? objectContext?.props?.extra?.[exprName]\n if (!Objects.isEmpty(prop)) {\n return prop\n }\n }\n\n // check if identifier is a composite attribute value prop\n if (NodeDefs.isAttribute(objectContext) && NodeValues.isValueProp({ nodeDef: objectContext, prop: exprName })) {\n return objectContext\n }\n\n if (memberProperty) {\n // property of a member expression (e.g. text_attr.length or text_attr.toUpperCase()): native properties first\n const nativeProperty = this.findNativeProperty(expressionNode)\n if (nativeProperty) return nativeProperty.value\n return this.getReferencedNodeDef(expressionNode)\n }\n // identifier not in a member expression: node defs first, so that node defs named like native properties\n // (e.g. \"name\", \"type\", \"trim\") are always found (and registered as dependencies)\n const referencedNodeDef = this.findReferencedNodeDef(expressionNode)\n if (referencedNodeDef) return referencedNodeDef\n\n const nativeProperty = this.findNativeProperty(expressionNode)\n if (nativeProperty) return nativeProperty.value\n\n return this.throwIdentifierNotFound(expressionNode)\n }\n\n /**\n * Finds the identifier among the native properties or functions of the context object\n * (e.g. String.length or String.toUpperCase()).\n */\n private findNativeProperty(expressionNode: IdentifierExpression): { value: any } | null {\n const { object: objectContext } = this.context\n const { name: exprName } = expressionNode\n\n const globalOrNativeProperty = this.findGlobalOrNativeProperty(expressionNode)\n if (globalOrNativeProperty) {\n return globalOrNativeProperty\n }\n if (NodeNativeProperties.hasNativeProperty({ nodeDefOrValue: objectContext, propName: exprName })) {\n return {\n value: NodeNativeProperties.evalNodeDefProperty({ nodeDefOrValue: objectContext, propName: exprName }),\n }\n }\n return null\n }\n\n private findReferencedNodeDef(expressionNode: IdentifierExpression): NodeDef<NodeDefType, NodeDefProps> | undefined {\n const { nodeDefCurrent, selfReferenceAllowed } = this.context\n const referencedNodeDef = this.findIdentifierAmongReachableNodeDefs(expressionNode)\n if (!referencedNodeDef) return undefined\n\n if (!selfReferenceAllowed && referencedNodeDef.uuid === nodeDefCurrent?.uuid) {\n throw new SystemError(ValidatorErrorKeys.expressions.cannotUseCurrentNode, { name: expressionNode.name })\n }\n this.addReferencedNodeDefUuid(referencedNodeDef.uuid)\n return referencedNodeDef\n }\n\n private getReferencedNodeDef(expressionNode: IdentifierExpression): NodeDef<NodeDefType, NodeDefProps> {\n return this.findReferencedNodeDef(expressionNode) ?? this.throwIdentifierNotFound(expressionNode)\n }\n\n private throwIdentifierNotFound(expressionNode: IdentifierExpression): never {\n throw new SystemError(SystemErrorKeys.expression.identifierNotFound, {\n name: expressionNode.name,\n contextObject: this.context.object?.props?.name,\n })\n }\n\n private addReferencedNodeDefUuid(uuid: string) {\n const { context } = this\n const { referencedNodeDefUuids = new Set() } = context\n context.referencedNodeDefUuids = referencedNodeDefUuids.add(uuid)\n }\n\n /**\n * Tries to find the specified identifier among the node defs that can be \"reached\" from the context node def.\n */\n protected findIdentifierAmongReachableNodeDefs(\n expressionNode: IdentifierExpression\n ): NodeDef<NodeDefType, NodeDefProps> | undefined {\n const { object: contextObject } = this.context\n\n if (!contextObject) return undefined\n\n // stop at the first match (same order as getReachableNodeDefs), without visiting all the reachable node defs\n for (const reachableNodeDef of this.iterateReachableNodeDefs()) {\n if (reachableNodeDef.props.name === expressionNode.name) {\n return reachableNodeDef\n }\n }\n return undefined\n }\n\n /**\n * Get reachable node defs, i.e. the children of the node definition's ancestors.\n * NOTE: The root node def is excluded, but it _should_ be an entity, so that is fine.\n */\n protected getReachableNodeDefs(): NodeDef<NodeDefType, NodeDefProps>[] {\n return Array.from(this.iterateReachableNodeDefs())\n }\n\n /**\n * Iterates over the reachable node defs (see getReachableNodeDefs), yielding every node def only once.\n */\n private *iterateReachableNodeDefs(): Generator<NodeDef<NodeDefType, NodeDefProps>> {\n const { context } = this\n const { survey, includeAnalysis } = context\n\n const reachableNodeDefUuids = new Set<string>()\n const visitedUuids = new Set<string>()\n\n const queue = new Queue<NodeDef<NodeDefType>>()\n\n const actualContextNode = findActualContextNode({ context })\n if (actualContextNode) {\n queue.enqueue(actualContextNode)\n reachableNodeDefUuids.add(actualContextNode.uuid)\n yield actualContextNode\n }\n\n while (!queue.isEmpty()) {\n const entityDefCurrent = queue.dequeue()!\n const entityDefCurrentChildren = getNodeDefChildren({ survey, nodeDef: entityDefCurrent, includeAnalysis })\n for (const childDef of entityDefCurrentChildren) {\n if (!reachableNodeDefUuids.has(childDef.uuid)) {\n reachableNodeDefUuids.add(childDef.uuid)\n yield childDef\n }\n }\n // visit nodes inside single entities\n queue.enqueueItems(entityDefCurrentChildren.filter(NodeDefs.isSingleEntity))\n\n // avoid visiting 2 times the same entity definition when traversing single entities\n if (!visitedUuids.has(entityDefCurrent.uuid)) {\n const entityDefCurrentParent = getNodeDefParent({ survey, nodeDef: entityDefCurrent })\n if (entityDefCurrentParent) {\n queue.enqueue(entityDefCurrentParent)\n }\n if (!reachableNodeDefUuids.has(entityDefCurrent.uuid)) {\n reachableNodeDefUuids.add(entityDefCurrent.uuid)\n yield entityDefCurrent\n }\n visitedUuids.add(entityDefCurrent.uuid)\n }\n }\n }\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import { User } from '../../auth';
2
2
  import { ExpressionContext } from '../../expression';
3
3
  import { ArenaRecordNode } from '../../node';
4
+ import { AreaOfInterestProvider } from '../../nodeDefExpressionEvaluator/areaOfInterestProvider';
4
5
  import { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider';
5
6
  import { TaxonProvider } from '../../nodeDefExpressionEvaluator/taxonProvider';
6
7
  import { Survey } from '../../survey';
@@ -15,4 +16,5 @@ export interface RecordExpressionContext extends ExpressionContext {
15
16
  item?: any;
16
17
  categoryItemProvider?: CategoryItemProvider;
17
18
  taxonProvider?: TaxonProvider;
19
+ areaOfInterestProvider?: AreaOfInterestProvider;
18
20
  }
@@ -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 { 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
+ {"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 { AreaOfInterestProvider } from '../../nodeDefExpressionEvaluator/areaOfInterestProvider'\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 areaOfInterestProvider?: AreaOfInterestProvider\n}\n"]}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RecordIdentifierEvaluator = void 0;
4
4
  const expression_1 = require("../../../../expression");
5
+ const global_1 = require("../../../../expression/javascript/global");
5
6
  const identifier_1 = require("../../../../expression/javascript/node/identifier");
6
7
  const nodeDef_1 = require("../../../../nodeDef");
7
8
  const records_1 = require("../../../records");
@@ -80,6 +81,9 @@ class RecordIdentifierEvaluator extends identifier_1.IdentifierEvaluator {
80
81
  if (propName === expression_1.ExpressionVariable.CONTEXT) {
81
82
  return this.context.nodeContext;
82
83
  }
84
+ if ((0, global_1.isForbiddenPropertyName)(propName)) {
85
+ throw new error_1.SystemError(error_1.SystemErrorKeys.expression.identifierNotFound, { name: propName });
86
+ }
83
87
  // try to find identifier among global or native properties
84
88
  // (not-found is signaled without throwing; the try/catch only handles the rare case of an unknown member of a global object)
85
89
  try {
@@ -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 { 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, SystemErrorKeys } 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(SystemErrorKeys.expression.nodeNotFoundForNodeDef, { nodeDefName: propName })\n return []\n }\n if (referencedNodes.length > 1)\n throw new SystemError(SystemErrorKeys.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(SystemErrorKeys.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(SystemErrorKeys.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(SystemErrorKeys.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(nodeObject, nodeDefReferenced.uuid)(record)\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 { isForbiddenPropertyName } from '../../../../expression/javascript/global'\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, SystemErrorKeys } 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(SystemErrorKeys.expression.nodeNotFoundForNodeDef, { nodeDefName: propName })\n return []\n }\n if (referencedNodes.length > 1)\n throw new SystemError(SystemErrorKeys.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(SystemErrorKeys.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(SystemErrorKeys.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(SystemErrorKeys.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(nodeObject, nodeDefReferenced.uuid)(record)\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 if (isForbiddenPropertyName(propName)) {\n throw new SystemError(SystemErrorKeys.expression.identifierNotFound, { name: propName })\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"]}
@@ -7,6 +7,7 @@ import { ArenaRecordNode } from '../../node';
7
7
  import { NodeDefExpression } from '../../nodeDef';
8
8
  import { Survey } from '../../survey';
9
9
  import { Taxon } from '../../taxonomy';
10
+ import { AreaOfInterestProvider } from '../../nodeDefExpressionEvaluator/areaOfInterestProvider';
10
11
  import { RecordExpressionContext } from './context';
11
12
  type ExpressionEvaluateParams = {
12
13
  user: User;
@@ -15,6 +16,7 @@ type ExpressionEvaluateParams = {
15
16
  prevCycleRecord?: ArenaRecord;
16
17
  timezoneOffset?: number;
17
18
  lang?: LanguageCode;
19
+ areaOfInterestProvider?: AreaOfInterestProvider;
18
20
  };
19
21
  export declare class RecordExpressionEvaluator extends JavascriptExpressionEvaluator<RecordExpressionContext> {
20
22
  constructor();
@@ -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 { 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
+ {"version":3,"file":"recordExpressionEvaluator.js","sourceRoot":"","sources":["../../../src/record/recordExpressionEvaluator/recordExpressionEvaluator.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,iDAAoF;AAGpF,2CAA2D;AAC3D,yCAA8C;AAE9C,uCAAqC;AACrC,wCAAoC;AAGpC,2CAAuD;AACvD,kDAA6D;AAC7D,wDAA0D;AAY1D,+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 { AreaOfInterestProvider } from '../../nodeDefExpressionEvaluator/areaOfInterestProvider'\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 areaOfInterestProvider?: AreaOfInterestProvider\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,5 +1,6 @@
1
1
  import { User } from '../../auth';
2
2
  import { LanguageCode } from '../../language';
3
+ import { AreaOfInterestProvider } from '../../nodeDefExpressionEvaluator/areaOfInterestProvider';
3
4
  import { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider';
4
5
  import { TaxonProvider } from '../../nodeDefExpressionEvaluator/taxonProvider';
5
6
  import { Survey } from '../../survey';
@@ -13,5 +14,6 @@ export interface RecordExpressionEvaluationContext {
13
14
  lang?: LanguageCode;
14
15
  categoryItemProvider?: CategoryItemProvider;
15
16
  taxonProvider?: TaxonProvider;
17
+ areaOfInterestProvider?: AreaOfInterestProvider;
16
18
  sideEffect?: boolean;
17
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"recordExpressionEvaluationContext.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordExpressionEvaluationContext.ts"],"names":[],"mappings":"","sourcesContent":["import { User } from '../../auth'\nimport { LanguageCode } from '../../language'\nimport { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider'\nimport { TaxonProvider } from '../../nodeDefExpressionEvaluator/taxonProvider'\nimport { Survey } from '../../survey'\nimport type { ArenaRecord } from '../record'\n\nexport interface RecordExpressionEvaluationContext {\n user: User\n survey: Survey\n record: ArenaRecord\n prevCycleRecord?: ArenaRecord\n timezoneOffset?: number\n lang?: LanguageCode\n categoryItemProvider?: CategoryItemProvider\n taxonProvider?: TaxonProvider\n sideEffect?: boolean\n}\n"]}
1
+ {"version":3,"file":"recordExpressionEvaluationContext.js","sourceRoot":"","sources":["../../../src/record/recordNodesUpdater/recordExpressionEvaluationContext.ts"],"names":[],"mappings":"","sourcesContent":["import { User } from '../../auth'\nimport { LanguageCode } from '../../language'\nimport { AreaOfInterestProvider } from '../../nodeDefExpressionEvaluator/areaOfInterestProvider'\nimport { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider'\nimport { TaxonProvider } from '../../nodeDefExpressionEvaluator/taxonProvider'\nimport { Survey } from '../../survey'\nimport type { ArenaRecord } from '../record'\n\nexport interface RecordExpressionEvaluationContext {\n user: User\n survey: Survey\n record: ArenaRecord\n prevCycleRecord?: ArenaRecord\n timezoneOffset?: number\n lang?: LanguageCode\n categoryItemProvider?: CategoryItemProvider\n taxonProvider?: TaxonProvider\n areaOfInterestProvider?: AreaOfInterestProvider\n sideEffect?: boolean\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import { User } from '../../auth';
2
2
  import { Dictionary } from '../../common';
3
3
  import { ArenaRecordNode } from '../../node';
4
+ import { AreaOfInterestProvider } from '../../nodeDefExpressionEvaluator/areaOfInterestProvider';
4
5
  import { CategoryItemProvider } from '../../nodeDefExpressionEvaluator/categoryItemProvider';
5
6
  import { TaxonProvider } from '../../nodeDefExpressionEvaluator/taxonProvider';
6
7
  import { Survey } from '../../survey';
@@ -11,6 +12,7 @@ export interface RecordValidatorParams {
11
12
  survey: Survey;
12
13
  categoryItemProvider?: CategoryItemProvider;
13
14
  taxonProvider?: TaxonProvider;
15
+ areaOfInterestProvider?: AreaOfInterestProvider;
14
16
  record: ArenaRecord;
15
17
  }
16
18
  export interface AttributeValidatorParams extends RecordValidatorParams {
@@ -98,7 +98,7 @@ const _validateRequired = (params) => (_field, node) => __awaiter(void 0, void 0
98
98
  */
99
99
  const _validateNodeValidations = (params) => (_propName, node) => __awaiter(void 0, void 0, void 0, function* () {
100
100
  var _a;
101
- const { user, survey, record, nodeDef } = params;
101
+ const { user, survey, record, nodeDef, areaOfInterestProvider } = params;
102
102
  if (node_1.Nodes.isValueBlank(node))
103
103
  return validation_1.ValidationResultFactory.createInstance();
104
104
  const validations = nodeDef_1.NodeDefs.getValidations(nodeDef);
@@ -108,6 +108,7 @@ const _validateNodeValidations = (params) => (_propName, node) => __awaiter(void
108
108
  user,
109
109
  survey,
110
110
  record,
111
+ areaOfInterestProvider,
111
112
  nodeCtx: node,
112
113
  expressions: validations.expressions,
113
114
  stopAtFirstFound: false,