UNPKG

cbon

Version:
58 lines (57 loc) 1.65 kB
import { Block, Arr, Str, Num, Bool, Null, Comma } from "./ast"; import { doRecursive, doRecursiveAsync } from "./recursive"; export function toJsObj(doc, config = { async: false }) { var _a; return ((_a = config) === null || _a === void 0 ? void 0 : _a.async) ? doRecursiveAsync(root, doc) : doRecursive(root, doc); } function* root(ctx, doc) { const cs = []; for (const u of doc.items) { if (u instanceof Block) { cs.push(yield ctx.call(block, u)); } else if (u instanceof Arr) { cs.push(yield ctx.call(arr, u)); } } return cs; } function* unit(ctx, u) { if (u instanceof Block) return yield ctx.call(block, u); else if (u instanceof Arr) return yield ctx.call(arr, u); else if (u instanceof Num) return u.val; else if (u instanceof Str) return u.val; else if (u instanceof Bool) return u.val; else if (u instanceof Null) return null; else return undefined; } function key(k) { return k.key instanceof Str ? k.key.val : k.key; } function* block(ctx, b) { const kvs = []; for (const kv of b.items) { if (kv instanceof Comma) continue; const v = yield ctx.call(unit, kv.val); if (v !== undefined) kvs.push([key(kv.key), v]); } return Object.fromEntries(kvs); } function* arr(ctx, a) { const ars = []; for (const u of a.items) { const v = yield ctx.call(unit, u); if (v !== undefined) ars.push(v); } return ars; }