| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | const filterMetadata = (o) => {    const copy = {...o};    delete copy._;    return copy;  };    const flatten = (arr) => {   return arr.reduce((c,v) => {     if(Array.isArray(v)){       return c.concat(flatten(v));     }     return c.concat(v);   }, []);  };    function Query(db) {    if(!(this instanceof Query)) {      return new Query(db);    }    this.db = db;    this.nodes = [];    this.cursor = 0;    this.ctx = void 0;  }    Query.prototype.add = function add(node) {    this.cursor += 1;    this.nodes.push(node);    this.ctx = this.nodes[this.nodes.length - 1];  };    Query.prototype.getSet = function getSet() {    const n = this.ctx.then(v => {      if(Array.isArray(v)) {        return v.map(filterMetadata);      }      return filterMetadata(v);    })    .then(r => {      const getValues = (node) => {        return Promise.all(Object.keys(node).map(k => this.db.get(k).then()));      };      if(Array.isArray(r)) {        return Promise.all(r.map(getValues)).then(flatten);      }      return getValues(r);    })    this.add(n);    return this;  }    Query.prototype.get = function get(path) {    if(this.cursor === 0) {      const node = this.db.get(path).then();      this.add(node);      return this;    }    const prev = this.nodes[this.cursor - 1];    const pNode = prev.then(r => {      if(Array.isArray(r)) {        const nodes = r.map(v => {          if(v[path] && v[path]["#"]) {            return this.db.get(v[path]["#"]).then();          }          return v[path] ? Promise.resolve(v[path]) : "";        });        return Promise.all(nodes.filter(v => v));      }      if(r[path] && r[path]["#"]) {        return this.db.get(r[path]["#"]).then();      }      return r[path] ? Promise.resolve(r[path]) : "";    });    this.add(pNode);    return this;  };    Query.prototype.data = function data(cb) {    return this.ctx.then(v => {      if(Array.isArray(v)) {        return Promise.all(v);      }      return v;    });  };export {Query}
 |