UNPKG

jora

Version:

JavaScript object query engine

99 lines (85 loc) 2.05 kB
'use strict'; 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' ]); 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; } } } 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); } function walk(node, ctx) { ctx.node(node.key); ctx.nodeOrNothing(node.value); } 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); } exports.compile = compile; exports.stringify = stringify; exports.suggest = suggest; exports.walk = walk;