UNPKG

jora

Version:

JavaScript object query engine

116 lines (100 loc) 3.27 kB
export function suggest(node, ctx) { if (!Array.isArray(node.assertion)) { ctx.range(node.assertion.range, 'var'); ctx.range(node.assertion.range, 'assertion'); } } export function compile(node, ctx) { if (Array.isArray(node.assertion)) { ctx.put(node.negation ? '!(' : '('); for (let i = 0; i < node.assertion.length; i++) { if (i % 2 === 0) { ctx.node(node.assertion[i]); } else { switch (node.assertion[i]) { case 'and': ctx.put('&&'); break; case 'or': ctx.put('||'); break; default: ctx.error('Bad conjuction operator in assertion', node); } } } ctx.put(')'); } else { if (node.negation) { ctx.put('!'); } switch (node.assertion.type) { case 'Identifier': if (node.assertion.name) { ctx.put('!!'); if (ctx.tolerant) { ctx.put('(typeof '); } ctx.put('a['); ctx.node(node.assertion); ctx.put(']'); if (ctx.tolerant) { ctx.put('==="function"?a['); ctx.node(node.assertion); ctx.put(']'); } ctx.put('.call(mctx,'); ctx.nodeOrCurrent(); ctx.put(')'); if (ctx.tolerant) { ctx.put(':false)'); } if (ctx.usedAssertions.has(node.assertion.name)) { ctx.usedAssertions.get(node.assertion.name).push(node.assertion.range); } else { ctx.usedAssertions.set(node.assertion.name, node.assertion.range); } } else { ctx.put('false'); } break; case 'Method': ctx.put('!!'); ctx.node(node.assertion); break; default: ctx.error('Unknown assertion node type "' + node.assertion.type + '"', node.assertion); } } } export function walk(node, ctx) { if (Array.isArray(node.assertion)) { for (let i = 0; i < node.assertion.length; i++) { if (i % 2 === 0) { ctx.node(node.assertion[i]); } } } else { ctx.node(node.assertion); } } export function stringify(node, ctx) { if (node.negation) { ctx.put('not '); } if (Array.isArray(node.assertion)) { ctx.put('('); for (let i = 0; i < node.assertion.length; i++) { if (i % 2 === 0) { ctx.node(node.assertion[i]); } else { ctx.put(' '); ctx.put(node.assertion[i]); ctx.put(' '); } } ctx.put(')'); } else { ctx.node(node.assertion); } }