| /*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 */ |
| if (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 */ |
| if (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; |
| }; |