expression-expander
Version:
expands expressions in object graphs
64 lines (63 loc) • 2.48 kB
text/typescript
/**
* @callback Evaluator
* @param {string} expression
* @param {Object} context
* @param {[PathEntry]} path
* @return {Object} expression evaluation result
*/
/**
* @typedef {Object} PathEntry
* @property {Object} value
*/
/**
* @callback Quoter
* @param {string} value to be quoted
* @return {string} quoted value
*/
/**
* @callback Expander
* @param {string|boolean|number|bigint|Object|Map|Set} value
* @param {PathEntry[]} [path]
* @return {string|boolean|number|bigint|Object|Map|Set} expression evaluation result
*/
/**
* @typedef {Object} ExpressionExpander
* @property {Object} properties
* @property {Expander} expand
*/
/**
* Creates a new expansion context
* @param {Object} [options] object with the following keys
* @param {string} [options.leftMarker] lead in of expression
* @param {string} [options.rightMarker] lead out of expression
* @param {RegExp|string} [options.markerRegexp] expression with lead in / out
* @param {Quoter} [options.valueQuoter] to quote expanded values
* by default no special quoting is done and the evaluated result will be direcly
* inserted into the output string
* @param {Evaluator} [options.evaluate] evaluate(expression,context,path) function to evaluate expressions
* the default evaluation function does a lookup into the properties
* @param {boolean} [options.keepUndefinedValues] true: is expression resolves to undefind the original string will be used (with surrounding ${})
* @param {number} [options.maxNestingLevel] max number of recursive calls to expand defaults to 20
* @param {Object} [options.properties] default properties to evaluate expression against
* @return {ExpressionExpander} newly created expansion context
*/
export function createContext(options?: {
leftMarker?: string;
rightMarker?: string;
markerRegexp?: RegExp | string;
valueQuoter?: Quoter;
evaluate?: Evaluator;
keepUndefinedValues?: boolean;
maxNestingLevel?: number;
properties?: any;
}): ExpressionExpander;
export type Evaluator = (expression: string, context: any, path: [PathEntry]) => any;
export type PathEntry = {
value: any;
};
export type Quoter = (value: string) => string;
export type Expander = (value: string | boolean | number | bigint | any | Map<any, any> | Set<any>, path?: PathEntry[]) => string | boolean | number | bigint | any | Map<any, any> | Set<any>;
export type ExpressionExpander = {
properties: any;
expand: Expander;
};