Code coverage report for lib/utils.js

Statements: 100% (102 / 102)      Branches: 100% (44 / 44)      Functions: 100% (17 / 17)      Lines: 100% (102 / 102)      Ignored: 10 statements, 1 function, 4 branches     

All files » lib/ » utils.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184  2 2 2 2 2 2 2 2 2   2 2   2     2 2   2       2   2 179460     2 2 2   2 11706 11706 11706   11706 16441     5046   16441 140   16301 9626 6675 6541   74 74       16301       2 2   2 6356         2   2   2   2 32681   1   64895 1 1 1   1     1 1 1 1     1 1           32681 64897 2   64895 64895 64895 6219 6219 6219 17   6202         58676       2   2   2 5080           2 3733 3733   5140 619 619     3733     2   2 41970 41970   10       2 17085 17085   3       2 160 4   156 156 147 9 8   1       2 107 107    
/*jshint strict: false */
var merge = require('./merge');
exports.extend = require('pouchdb-extend');
exports.ajax = require('./deps/ajax/prequest');
exports.uuid = require('./deps/uuid');
exports.getArguments = require('argsarray');
var collections = require('pouchdb-collections');
exports.Map = collections.Map;
exports.Set = collections.Set;
var parseDoc = require('./deps/docs/parseDoc');
 
var Promise = require('./deps/promise');
exports.Promise = Promise;
 
var base64 = require('./deps/binary/base64');
 
// TODO: don't export these
exports.atob = base64.atob;
exports.btoa = base64.btoa;
 
var binStringToBlobOrBuffer =
  require('./deps/binary/binaryStringToBlobOrBuffer');
 
// TODO: only used by the integration tests
exports.binaryStringToBlobOrBuffer = binStringToBlobOrBuffer;
 
exports.clone = function (obj) {
  return exports.extend(true, {}, obj);
};
 
exports.pick = require('./deps/pick');
exports.inherits = require('inherits');
exports.call = require('./deps/call');
 
exports.filterChange = function filterChange(opts) {
  var req = {};
  var hasFilter = opts.filter && typeof opts.filter === 'function';
  req.query = opts.query_params;
 
  return function filter(change) {
    if (!change.doc) {
      // CSG sends events on the changes feed that don't have documents,
      // this hack makes a whole lot of existing code robust.
      change.doc = {};
    }
    if (opts.filter && hasFilter && !opts.filter.call(this, change.doc, req)) {
      return false;
    }
    if (!opts.include_docs) {
      delete change.doc;
    } else if (!opts.attachments) {
      for (var att in change.doc._attachments) {
        /* istanbul ignore else */
        Eif (change.doc._attachments.hasOwnProperty(att)) {
          change.doc._attachments[att].stub = true;
        }
      }
    }
    return true;
  };
};
 
exports.parseDoc = parseDoc.parseDoc;
exports.invalidIdError = parseDoc.invalidIdError;
 
exports.isCordova = function () {
  return (typeof cordova !== "undefined" ||
          typeof PhoneGap !== "undefined" ||
          typeof phonegap !== "undefined");
};
 
exports.Changes = require('./changesHandler');
 
exports.once = require('./deps/once');
 
exports.toPromise = require('./deps/toPromise');
 
exports.adapterFun = function (name, callback) {
  var log = require('debug')('pouchdb:api');
 
  function logApiCall(self, name, args) {
    /* istanbul ignore if */
    Iif (log.enabled) {
      var logArgs = [self._db_name, name];
      for (var i = 0; i < args.length - 1; i++) {
        logArgs.push(args[i]);
      }
      log.apply(null, logArgs);
 
      // override the callback itself to log the response
      var origCallback = args[args.length - 1];
      args[args.length - 1] = function (err, res) {
        var responseArgs = [self._db_name, name];
        responseArgs = responseArgs.concat(
          err ? ['error', err] : ['success', res]
        );
        log.apply(null, responseArgs);
        origCallback(err, res);
      };
    }
  }
 
 
  return exports.toPromise(exports.getArguments(function (args) {
    if (this._closed) {
      return Promise.reject(new Error('database is closed'));
    }
    var self = this;
    logApiCall(self, name, args);
    if (!this.taskqueue.isReady) {
      return new Promise(function (fulfill, reject) {
        self.taskqueue.addTask(function (failed) {
          if (failed) {
            reject(failed);
          } else {
            fulfill(self[name].apply(self, args));
          }
        });
      });
    }
    return callback.apply(this, args);
  }));
};
 
exports.explain404 = require('./deps/ajax/explain404');
 
exports.parseUri = require('./deps/parseUri');
 
exports.compare = function (left, right) {
  return left < right ? -1 : left > right ? 1 : 0;
};
 
 
// compact a tree by marking its non-leafs as missing,
// and return a list of revs to delete
exports.compactTree = function compactTree(metadata) {
  var revs = [];
  merge.traverseRevTree(metadata.rev_tree, function (isLeaf, pos,
                                                     revHash, ctx, opts) {
    if (opts.status === 'available' && !isLeaf) {
      revs.push(pos + '-' + revHash);
      opts.status = 'missing';
    }
  });
  return revs;
};
 
var vuvuzela = require('vuvuzela');
 
exports.safeJsonParse = function safeJsonParse(str) {
  try {
    return JSON.parse(str);
  } catch (e) {
    return vuvuzela.parse(str);
  }
};
 
exports.safeJsonStringify = function safeJsonStringify(json) {
  try {
    return JSON.stringify(json);
  } catch (e) {
    return vuvuzela.stringify(json);
  }
};
 
exports.parseDesignDocFunctionName = function (s) {
  if (!s) {
    return null;
  }
  var parts = s.split('/');
  if (parts.length === 2) {
    return parts;
  } else if (parts.length === 1) {
    return [s, s];
  } else {
    return null;
  }
};
 
exports.normalizeDesignDocFunctionName = function (s) {
  var normalized = this.parseDesignDocFunctionName(s);
  return normalized ? normalized.join('/') : null;
};