UNPKG

@jsonjoy.com/json-expression

Version:

High-performance JSON Pointer implementation

79 lines (78 loc) 3.39 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.inputOperators = void 0; const tslib_1 = require("tslib"); const codegen_steps_1 = require("../codegen-steps"); const util = tslib_1.__importStar(require("../util")); const jsonPointer = tslib_1.__importStar(require("@jsonjoy.com/json-pointer")); const find_1 = require("@jsonjoy.com/json-pointer/lib/codegen/find"); const get = (vars, varname) => { if (typeof varname !== 'string') throw new Error('varname must be a string.'); const [name, pointer] = util.parseVar(varname); jsonPointer.validateJsonPointer(pointer); const data = vars.get(name); const path = jsonPointer.toPath(pointer); const value = jsonPointer.get(data, path); return value; }; exports.inputOperators = [ [ '$', ['get'], [1, 2], (expr, ctx) => { const varname = ctx.eval(expr[1], ctx); const defval = ctx.eval(expr[2], ctx); const value = get(ctx.vars, varname); return util.throwOnUndef(value, defval); }, (ctx) => { ctx.link(util.throwOnUndef, 'throwOnUndef'); const varname = ctx.operands[0]; if (varname instanceof codegen_steps_1.Literal) { if (typeof varname.val !== 'string') throw new Error('varname must be a string.'); const [name, pointer] = util.parseVar(varname.val); if (!pointer) return new codegen_steps_1.Expression(!name ? 'vars.env' : `vars.get(${JSON.stringify(name)})`); jsonPointer.validateJsonPointer(pointer); const hasDefaultValue = ctx.expr.length === 3; const defaultValue = hasDefaultValue ? ctx.operands[1] : undefined; const fn = (0, find_1.$$find)(jsonPointer.toPath(pointer)); const find = ctx.const(fn); const data = `vars.get(${JSON.stringify(name)})`; return new codegen_steps_1.Expression(`throwOnUndef(${find}(${data}),(${defaultValue}))`); } ctx.link(get, 'get'); return new codegen_steps_1.Expression(`throwOnUndef(get(vars,(${varname})),(${ctx.operands[1]}))`); }, /* has side-effects */ true, ], [ '$?', ['get?'], 1, (expr, ctx) => { const varname = ctx.eval(expr[1], ctx); const value = get(ctx.vars, varname); return value !== undefined; }, (ctx) => { const varname = ctx.operands[0]; if (varname instanceof codegen_steps_1.Literal) { if (typeof varname.val !== 'string') throw new Error('varname must be a string.'); const [name, pointer] = util.parseVar(varname.val); jsonPointer.validateJsonPointer(pointer); const fn = (0, find_1.$$find)(jsonPointer.toPath(pointer)); const find = ctx.const(fn); const data = `vars.get(${JSON.stringify(name)})`; return new codegen_steps_1.Expression(`${find}(${data})!==undefined`); } ctx.link(get, 'get'); return new codegen_steps_1.Expression(`get(vars,(${varname}))!==undefined`); }, /* has side-effects */ true, ], ];