UNPKG

jora

Version:

JavaScript object query engine

92 lines (80 loc) 1.96 kB
const GetProperty = function(value, property, range) { return { type: 'GetProperty', value, property, range }; }; const Identifier = function(name, range) { return { type: 'Identifier', name, range }; }; const noBracketKeyType = new Set([ 'Literal', 'Identifier', 'Reference', 'Current' ]); export function suggest(node, ctx) { if (node.value === null) { switch (node.key.type) { case 'Literal': case 'Identifier': ctx.range(node.range, 'path'); ctx.range(node.range, 'var'); break; case 'Current': case 'Reference': ctx.range(node.range, 'var'); break; } } } export function compile(node, ctx) { let value = node.value; switch (node.key.type) { case 'Current': ctx.put('...null'); return; case 'Literal': ctx.node(node.key); value = value || GetProperty(null, Identifier(String(node.key.value))); break; case 'Identifier': ctx.node(node.key); value = value || GetProperty(null, node.key); break; case 'Reference': ctx.node(node.key.name); value = value || node.key; break; default: ctx.put('['); ctx.node(node.key); ctx.put(']'); } ctx.put(':'); ctx.node(value); } export function walk(node, ctx) { ctx.node(node.key); ctx.nodeOrNothing(node.value); } export function stringify(node, ctx) { if (noBracketKeyType.has(node.key.type)) { ctx.node(node.key); if (node.value === null) { return; } } else { ctx.put('['); ctx.node(node.key); ctx.put(']'); } ctx.put(':'); ctx.node(node.value); }