@openforis/arena-core 2.18.14 → 2.18.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/nodeDefExpressionEvaluator/node/identifier.js +3 -9
- package/dist/esm/nodeDefExpressionEvaluator/node/identifier.js.map +1 -1
- package/dist/esm/utils/_objects/stringify.js +1 -4
- package/dist/esm/utils/_objects/stringify.js.map +1 -1
- package/dist/nodeDefExpressionEvaluator/node/identifier.d.ts +2 -6
- package/dist/nodeDefExpressionEvaluator/node/identifier.js +3 -9
- package/dist/nodeDefExpressionEvaluator/node/identifier.js.map +1 -1
- package/dist/utils/_objects/stringify.js +1 -4
- package/dist/utils/_objects/stringify.js.map +1 -1
- package/package.json +5 -5
|
@@ -135,7 +135,7 @@ export class NodeDefIdentifierEvaluator extends IdentifierEvaluator {
|
|
|
135
135
|
const { object: contextObject } = this.context;
|
|
136
136
|
if (!contextObject)
|
|
137
137
|
return undefined;
|
|
138
|
-
// stop at the first match
|
|
138
|
+
// stop at the first match, without visiting all the reachable node defs
|
|
139
139
|
for (const reachableNodeDef of this.iterateReachableNodeDefs()) {
|
|
140
140
|
if (reachableNodeDef.props.name === expressionNode.name) {
|
|
141
141
|
return reachableNodeDef;
|
|
@@ -144,14 +144,8 @@ export class NodeDefIdentifierEvaluator extends IdentifierEvaluator {
|
|
|
144
144
|
return undefined;
|
|
145
145
|
}
|
|
146
146
|
/**
|
|
147
|
-
*
|
|
148
|
-
*
|
|
149
|
-
*/
|
|
150
|
-
getReachableNodeDefs() {
|
|
151
|
-
return Array.from(this.iterateReachableNodeDefs());
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Iterates over the reachable node defs (see getReachableNodeDefs), yielding every node def only once.
|
|
147
|
+
* Iterates over the reachable node defs, i.e. the actual context node def, the children of its ancestors
|
|
148
|
+
* (including the ones inside single entities) and the ancestors themselves, yielding every node def only once.
|
|
155
149
|
*/
|
|
156
150
|
*iterateReachableNodeDefs() {
|
|
157
151
|
const { context } = this;
|
|
@@ -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, 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
|
+
{"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, 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 * Iterates over the reachable node defs, i.e. the actual context node def, the children of its ancestors\n * (including the ones inside single entities) and the ancestors themselves, 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"]}
|
|
@@ -16,12 +16,9 @@ export var StringifyKeys;
|
|
|
16
16
|
export const stringify = (object, _replacer, space = undefined) => {
|
|
17
17
|
if (isNil(object))
|
|
18
18
|
return null;
|
|
19
|
-
const replacer = (
|
|
19
|
+
const replacer = (_key, value) => {
|
|
20
20
|
if (isNil(value))
|
|
21
21
|
return null;
|
|
22
|
-
if (isNil(key)) {
|
|
23
|
-
return stringify(value);
|
|
24
|
-
}
|
|
25
22
|
if (value.constructor === Map)
|
|
26
23
|
return {
|
|
27
24
|
[StringifyKeys.type]: 'Map',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stringify.js","sourceRoot":"","sources":["../../../../src/utils/_objects/stringify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE/B,MAAM,CAAN,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,gCAAe,CAAA;IACf,oCAAmB,CAAA;AACrB,CAAC,EAHW,aAAa,KAAb,aAAa,QAGxB;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,MAAW,EACX,SAA4C,EAC5C,KAAK,GAAG,SAAS,EACF,EAAE;IACjB,IAAI,KAAK,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAA;IAE9B,MAAM,QAAQ,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"stringify.js","sourceRoot":"","sources":["../../../../src/utils/_objects/stringify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE/B,MAAM,CAAN,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,gCAAe,CAAA;IACf,oCAAmB,CAAA;AACrB,CAAC,EAHW,aAAa,KAAb,aAAa,QAGxB;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,MAAW,EACX,SAA4C,EAC5C,KAAK,GAAG,SAAS,EACF,EAAE;IACjB,IAAI,KAAK,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAA;IAE9B,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,KAAU,EAAO,EAAE;QACjD,IAAI,KAAK,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QAE7B,IAAI,KAAK,CAAC,WAAW,KAAK,GAAG;YAC3B,OAAO;gBACL,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK;gBAC3B,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;aAC/D,CAAA;QACH,IAAI,KAAK,CAAC,WAAW,KAAK,GAAG;YAC3B,OAAO;gBACL,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK;gBAC3B,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;aAC9C,CAAA;QACH,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,QAAe,EAAE,KAAK,CAAC,CAAA;AACvD,CAAC,CAAA","sourcesContent":["import { isNil } from './isNil'\n\nexport enum StringifyKeys {\n type = '_type_',\n values = '_values_',\n}\n\n/**\n * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.\n * It handles objects, arrays, Map, Set, String, Number.\n *\n * @param {*} object - The value, object, to stringify.\n * @param _replacer - Custom replacer (not used yet)\n * @param space\n * @returns {*} - The stringified object.\n */\nexport const stringify = (\n object: any,\n _replacer?: (key: string, value: any) => any,\n space = undefined\n): string | null => {\n if (isNil(object)) return null\n\n const replacer = (_key: string, value: any): any => {\n if (isNil(value)) return null\n\n if (value.constructor === Map)\n return {\n [StringifyKeys.type]: 'Map',\n [StringifyKeys.values]: stringify(Array.from(value.entries())),\n }\n if (value.constructor === Set)\n return {\n [StringifyKeys.type]: 'Set',\n [StringifyKeys.values]: stringify([...value]),\n }\n return value\n }\n return JSON.stringify(object, replacer as any, space)\n}\n"]}
|
|
@@ -19,12 +19,8 @@ export declare class NodeDefIdentifierEvaluator extends IdentifierEvaluator<Node
|
|
|
19
19
|
*/
|
|
20
20
|
protected findIdentifierAmongReachableNodeDefs(expressionNode: IdentifierExpression): NodeDef<NodeDefType, NodeDefProps> | undefined;
|
|
21
21
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*/
|
|
25
|
-
protected getReachableNodeDefs(): NodeDef<NodeDefType, NodeDefProps>[];
|
|
26
|
-
/**
|
|
27
|
-
* Iterates over the reachable node defs (see getReachableNodeDefs), yielding every node def only once.
|
|
22
|
+
* Iterates over the reachable node defs, i.e. the actual context node def, the children of its ancestors
|
|
23
|
+
* (including the ones inside single entities) and the ancestors themselves, yielding every node def only once.
|
|
28
24
|
*/
|
|
29
25
|
private iterateReachableNodeDefs;
|
|
30
26
|
}
|
|
@@ -138,7 +138,7 @@ class NodeDefIdentifierEvaluator extends identifier_1.IdentifierEvaluator {
|
|
|
138
138
|
const { object: contextObject } = this.context;
|
|
139
139
|
if (!contextObject)
|
|
140
140
|
return undefined;
|
|
141
|
-
// stop at the first match
|
|
141
|
+
// stop at the first match, without visiting all the reachable node defs
|
|
142
142
|
for (const reachableNodeDef of this.iterateReachableNodeDefs()) {
|
|
143
143
|
if (reachableNodeDef.props.name === expressionNode.name) {
|
|
144
144
|
return reachableNodeDef;
|
|
@@ -147,14 +147,8 @@ class NodeDefIdentifierEvaluator extends identifier_1.IdentifierEvaluator {
|
|
|
147
147
|
return undefined;
|
|
148
148
|
}
|
|
149
149
|
/**
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*/
|
|
153
|
-
getReachableNodeDefs() {
|
|
154
|
-
return Array.from(this.iterateReachableNodeDefs());
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Iterates over the reachable node defs (see getReachableNodeDefs), yielding every node def only once.
|
|
150
|
+
* Iterates over the reachable node defs, i.e. the actual context node def, the children of its ancestors
|
|
151
|
+
* (including the ones inside single entities) and the ancestors themselves, yielding every node def only once.
|
|
158
152
|
*/
|
|
159
153
|
*iterateReachableNodeDefs() {
|
|
160
154
|
const { context } = this;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identifier.js","sourceRoot":"","sources":["../../../src/nodeDefExpressionEvaluator/node/identifier.ts"],"names":[],"mappings":";;;AACA,4DAAsG;AACtG,qDAAiD;AACjD,uCAA4C;AAC5C,4EAAiF;AACjF,+DAAqG;AAErG,iDAA2E;AAC3E,uCAA0D;AAC1D,iDAAqD;AACrD,2FAA0E;AAC1E,sDAAkD;AAElD;;;;;GAKG;AACH,MAAM,qBAAqB,GAAG,CAAC,MAE9B,EAAkD,EAAE;IACnD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;IAC1B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAA;IAExD,IAAI,CAAC,oBAAoB;QAAE,OAAO,SAAS,CAAA;IAE3C,IAAI,mBAAQ,CAAC,WAAW,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC/C,OAAO,IAAA,2BAAgB,EAAC,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAA;IACpE,CAAC;IACD,IAAI,oBAAoB,CAAC,OAAO,EAAE,CAAC;QACjC,OAAO,IAAA,2BAAgB,EAAC,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAA;IACpE,CAAC;IACD,OAAO,oBAAoB,CAAA;AAC7B,CAAC,CAAA;AAED,gCAAwC,SAAQ,gCAA6C;IAC3F,QAAQ,CAAC,cAAoC;QAC3C,IAAI,CAAC;YACH,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAAA;QACjE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC;IAEO,kBAAkB,CAAC,cAAoC;;;QAC7D,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;QACxB,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,OAAO,CAAA;QACtF,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAA;QAEzC,IAAI,IAAA,gCAAuB,EAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAA;QAC9C,CAAC;QAED,IAAI,QAAQ,KAAK,+BAAkB,CAAC,OAAO,EAAE,CAAC;YAC5C,IAAI,cAAc,EAAE,CAAC;gBACnB,IAAI,CAAC,wBAAwB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;YACpD,CAAC;YACD,OAAO,cAAc,CAAA;QACvB,CAAC;QAED,qCAAqC;QACrC,MAAM,oBAAoB,GAAG,IAAA,gCAAuB,EAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;QAC7E,IAAI,oBAAoB,KAAK,IAAI,EAAE,CAAC;YAClC,OAAO,oBAAoB,CAAA;QAC7B,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,IAAI,SAAG,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,KAAK,0CAAG,QAAQ,CAAC,mCAAI,MAAA,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,KAAK,0CAAE,KAAK,0CAAG,QAAQ,CAAC,CAAA;YACxF,IAAI,CAAC,eAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QAED,0DAA0D;QAC1D,IAAI,mBAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,uBAAU,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YAC9G,OAAO,aAAa,CAAA;QACtB,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,8GAA8G;YAC9G,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAA;YAC9D,IAAI,cAAc;gBAAE,OAAO,cAAc,CAAC,KAAK,CAAA;YAC/C,OAAO,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAA;QAClD,CAAC;QACD,yGAAyG;QACzG,kFAAkF;QAClF,MAAM,iBAAiB,GAAG,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAA;QACpE,IAAI,iBAAiB;YAAE,OAAO,iBAAiB,CAAA;QAE/C,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAA;QAC9D,IAAI,cAAc;YAAE,OAAO,cAAc,CAAC,KAAK,CAAA;QAE/C,OAAO,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAA;IACrD,CAAC;IAED;;;OAGG;IACK,kBAAkB,CAAC,cAAoC;QAC7D,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAC9C,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAA;QAEzC,MAAM,sBAAsB,GAAG,IAAI,CAAC,0BAA0B,CAAC,cAAc,CAAC,CAAA;QAC9E,IAAI,sBAAsB,EAAE,CAAC;YAC3B,OAAO,sBAAsB,CAAA;QAC/B,CAAC;QACD,IAAI,wDAAoB,CAAC,iBAAiB,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YAClG,OAAO;gBACL,KAAK,EAAE,wDAAoB,CAAC,mBAAmB,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;aACvG,CAAA;QACH,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAEO,qBAAqB,CAAC,cAAoC;QAChE,MAAM,EAAE,cAAc,EAAE,oBAAoB,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAC7D,MAAM,iBAAiB,GAAG,IAAI,CAAC,oCAAoC,CAAC,cAAc,CAAC,CAAA;QACnF,IAAI,CAAC,iBAAiB;YAAE,OAAO,SAAS,CAAA;QAExC,IAAI,CAAC,oBAAoB,IAAI,iBAAiB,CAAC,IAAI,MAAK,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,IAAI,CAAA,EAAE,CAAC;YAC7E,MAAM,IAAI,mBAAW,CAAC,+BAAkB,CAAC,WAAW,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,CAAC,CAAA;QAC3G,CAAC;QACD,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACrD,OAAO,iBAAiB,CAAA;IAC1B,CAAC;IAEO,oBAAoB,CAAC,cAAoC;;QAC/D,aAAO,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC,mCAAI,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAA;IACnG,CAAC;IAEO,uBAAuB,CAAC,cAAoC;;QAClE,MAAM,IAAI,mBAAW,CAAC,uBAAe,CAAC,UAAU,CAAC,kBAAkB,EAAE;YACnE,IAAI,EAAE,cAAc,CAAC,IAAI;YACzB,aAAa,EAAE,MAAA,MAAA,IAAI,CAAC,OAAO,CAAC,MAAM,0CAAE,KAAK,0CAAE,IAAI;SAChD,CAAC,CAAA;IACJ,CAAC;IAEO,wBAAwB,CAAC,IAAY;QAC3C,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;QACxB,MAAM,EAAE,sBAAsB,GAAG,IAAI,GAAG,EAAE,EAAE,GAAG,OAAO,CAAA;QACtD,OAAO,CAAC,sBAAsB,GAAG,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACnE,CAAC;IAED;;OAEG;IACO,oCAAoC,CAC5C,cAAoC;QAEpC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAE9C,IAAI,CAAC,aAAa;YAAE,OAAO,SAAS,CAAA;QAEpC,6GAA6G;QAC7G,KAAK,MAAM,gBAAgB,IAAI,IAAI,CAAC,wBAAwB,EAAE,EAAE,CAAC;YAC/D,IAAI,gBAAgB,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,IAAI,EAAE,CAAC;gBACxD,OAAO,gBAAgB,CAAA;YACzB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED;;;OAGG;IACO,oBAAoB;QAC5B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC,CAAA;IACpD,CAAC;IAED;;OAEG;IACK,CAAC,wBAAwB;QAC/B,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;QACxB,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAA;QAE3C,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAU,CAAA;QAC/C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAA;QAEtC,MAAM,KAAK,GAAG,IAAI,aAAK,EAAwB,CAAA;QAE/C,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;QAC5D,IAAI,iBAAiB,EAAE,CAAC;YACtB,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;YAChC,qBAAqB,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;YACjD,MAAM,iBAAiB,CAAA;QACzB,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YACxB,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,EAAG,CAAA;YACzC,MAAM,wBAAwB,GAAG,IAAA,6BAAkB,EAAC,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC,CAAA;YAC3G,KAAK,MAAM,QAAQ,IAAI,wBAAwB,EAAE,CAAC;gBAChD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC9C,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;oBACxC,MAAM,QAAQ,CAAA;gBAChB,CAAC;YACH,CAAC;YACD,qCAAqC;YACrC,KAAK,CAAC,YAAY,CAAC,wBAAwB,CAAC,MAAM,CAAC,mBAAQ,CAAC,cAAc,CAAC,CAAC,CAAA;YAE5E,oFAAoF;YACpF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7C,MAAM,sBAAsB,GAAG,IAAA,2BAAgB,EAAC,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAA;gBACtF,IAAI,sBAAsB,EAAE,CAAC;oBAC3B,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAA;gBACvC,CAAC;gBACD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;oBACtD,qBAAqB,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;oBAChD,MAAM,gBAAgB,CAAA;gBACxB,CAAC;gBACD,YAAY,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;YACzC,CAAC;QACH,CAAC;IACH,CAAC;CACF","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
|
+
{"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, 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 * Iterates over the reachable node defs, i.e. the actual context node def, the children of its ancestors\n * (including the ones inside single entities) and the ancestors themselves, 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"]}
|
|
@@ -19,12 +19,9 @@ var StringifyKeys;
|
|
|
19
19
|
const stringify = (object, _replacer, space = undefined) => {
|
|
20
20
|
if ((0, isNil_1.isNil)(object))
|
|
21
21
|
return null;
|
|
22
|
-
const replacer = (
|
|
22
|
+
const replacer = (_key, value) => {
|
|
23
23
|
if ((0, isNil_1.isNil)(value))
|
|
24
24
|
return null;
|
|
25
|
-
if ((0, isNil_1.isNil)(key)) {
|
|
26
|
-
return (0, exports.stringify)(value);
|
|
27
|
-
}
|
|
28
25
|
if (value.constructor === Map)
|
|
29
26
|
return {
|
|
30
27
|
[StringifyKeys.type]: 'Map',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stringify.js","sourceRoot":"","sources":["../../../src/utils/_objects/stringify.ts"],"names":[],"mappings":";;;AAAA,mCAA+B;AAE/B,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,gCAAe,CAAA;IACf,oCAAmB,CAAA;AACrB,CAAC,EAHW,aAAa,aAAb,aAAa,GAAb,aAAa,QAGxB;AAED;;;;;;;;GAQG;AACI,MAAM,SAAS,GAAG,CACvB,MAAW,EACX,SAA4C,EAC5C,KAAK,GAAG,SAAS,EACF,EAAE;IACjB,IAAI,IAAA,aAAK,EAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAA;IAE9B,MAAM,QAAQ,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"stringify.js","sourceRoot":"","sources":["../../../src/utils/_objects/stringify.ts"],"names":[],"mappings":";;;AAAA,mCAA+B;AAE/B,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,gCAAe,CAAA;IACf,oCAAmB,CAAA;AACrB,CAAC,EAHW,aAAa,aAAb,aAAa,GAAb,aAAa,QAGxB;AAED;;;;;;;;GAQG;AACI,MAAM,SAAS,GAAG,CACvB,MAAW,EACX,SAA4C,EAC5C,KAAK,GAAG,SAAS,EACF,EAAE;IACjB,IAAI,IAAA,aAAK,EAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAA;IAE9B,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,KAAU,EAAO,EAAE;QACjD,IAAI,IAAA,aAAK,EAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QAE7B,IAAI,KAAK,CAAC,WAAW,KAAK,GAAG;YAC3B,OAAO;gBACL,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK;gBAC3B,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,IAAA,QAAA,SAAS,EAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;aAC/D,CAAA;QACH,IAAI,KAAK,CAAC,WAAW,KAAK,GAAG;YAC3B,OAAO;gBACL,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK;gBAC3B,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,IAAA,QAAA,SAAS,EAAC,CAAC,GAAG,KAAK,CAAC,CAAC;aAC9C,CAAA;QACH,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,QAAe,EAAE,KAAK,CAAC,CAAA;AACvD,CAAC,CAAA;AAvBY,QAAA,SAAS,GAAT,SAAS,CAuBrB","sourcesContent":["import { isNil } from './isNil'\n\nexport enum StringifyKeys {\n type = '_type_',\n values = '_values_',\n}\n\n/**\n * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.\n * It handles objects, arrays, Map, Set, String, Number.\n *\n * @param {*} object - The value, object, to stringify.\n * @param _replacer - Custom replacer (not used yet)\n * @param space\n * @returns {*} - The stringified object.\n */\nexport const stringify = (\n object: any,\n _replacer?: (key: string, value: any) => any,\n space = undefined\n): string | null => {\n if (isNil(object)) return null\n\n const replacer = (_key: string, value: any): any => {\n if (isNil(value)) return null\n\n if (value.constructor === Map)\n return {\n [StringifyKeys.type]: 'Map',\n [StringifyKeys.values]: stringify(Array.from(value.entries())),\n }\n if (value.constructor === Set)\n return {\n [StringifyKeys.type]: 'Set',\n [StringifyKeys.values]: stringify([...value]),\n }\n return value\n }\n return JSON.stringify(object, replacer as any, space)\n}\n"]}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"name": "OpenForis",
|
|
5
5
|
"email": "openforis.arena@gmail.com"
|
|
6
6
|
},
|
|
7
|
-
"version": "2.18.
|
|
7
|
+
"version": "2.18.16",
|
|
8
8
|
"description": "Arena core module",
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
@@ -24,10 +24,10 @@
|
|
|
24
24
|
"@jest/globals": "^30.5.2",
|
|
25
25
|
"@types/jest": "^30.0.0",
|
|
26
26
|
"@types/lodash.isequal": "^4.5.8",
|
|
27
|
-
"@types/node": "^26.6.
|
|
27
|
+
"@types/node": "^26.6.6",
|
|
28
28
|
"@types/proj4": "^2.19.0",
|
|
29
|
-
"@typescript-eslint/eslint-plugin": "^8",
|
|
30
|
-
"@typescript-eslint/parser": "^8",
|
|
29
|
+
"@typescript-eslint/eslint-plugin": "^8.72.1",
|
|
30
|
+
"@typescript-eslint/parser": "^8.72.1",
|
|
31
31
|
"@typescript/native": "npm:typescript@7.0.2",
|
|
32
32
|
"eslint": "^10.13.0",
|
|
33
33
|
"eslint-plugin-no-explicit-type-exports": "^0.12.1",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"prettier": "^3.9.10",
|
|
39
39
|
"ts-jest": "^29.4.15",
|
|
40
40
|
"typescript": "npm:@typescript/typescript6@6.0.2",
|
|
41
|
-
"typescript-eslint": "^8"
|
|
41
|
+
"typescript-eslint": "^8.72.1"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@jsep-plugin/regex": "^1.1.0",
|