budibase/packages/core/src/indexing/evaluate.js

86 lines
2.2 KiB
JavaScript

import { compileCode } from "../common/compileCode"
import { isUndefined, keys, cloneDeep, isFunction, includes } from "lodash/fp"
import { defineError } from "../common"
export const filterEval = "FILTER_EVALUATE"
export const filterCompile = "FILTER_COMPILE"
export const mapEval = "MAP_EVALUATE"
export const mapCompile = "MAP_COMPILE"
export const removeUndeclaredFields = "REMOVE_UNDECLARED_FIELDS"
export const addUnMappedFields = "ADD_UNMAPPED_FIELDS"
export const addTheKey = "ADD_KEY"
const getEvaluateResult = () => ({
isError: false,
passedFilter: true,
result: null,
})
export const compileFilter = index => compileCode(index.filter)
export const compileMap = index => compileCode(index.map)
export const passesFilter = (record, index) => {
const context = { record }
if (!index.filter) return true
const compiledFilter = defineError(() => compileFilter(index), filterCompile)
return defineError(() => compiledFilter(context), filterEval)
}
export const mapRecord = (record, index) => {
const recordClone = cloneDeep(record)
const context = { record: recordClone }
const map = index.map ? index.map : "return {...record};"
const compiledMap = defineError(() => compileCode(map), mapCompile)
const mapped = defineError(() => compiledMap(context), mapEval)
const mappedKeys = keys(mapped)
for (let i = 0; i < mappedKeys.length; i++) {
const key = mappedKeys[i]
mapped[key] = isUndefined(mapped[key]) ? null : mapped[key]
if (isFunction(mapped[key])) {
delete mapped[key]
}
if (key === "IsNew") {
delete mapped.IsNew
}
}
mapped.key = record.key
mapped.sortKey = index.getSortKey
? compileCode(index.getSortKey)(context)
: record.id
return mapped
}
export const evaluate = record => index => {
const result = getEvaluateResult()
try {
result.passedFilter = passesFilter(record, index)
} catch (err) {
result.isError = true
result.passedFilter = false
result.result = err.message
}
if (!result.passedFilter) return result
try {
result.result = mapRecord(record, index)
} catch (err) {
result.isError = true
result.result = err.message
}
return result
}
export default evaluate