{"version":3,"sources":["jsdelivr-header.js","/npm/pouchdb-adapter-utils@9.0.0/lib/index.js"],"names":[],"mappings":"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","file":"/npm/pouchdb-adapter-utils@9.0.0/lib/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/pouchdb-adapter-utils@9.0.0/lib/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar pouchdbUtils = require('pouchdb-utils');\nvar pouchdbBinaryUtils = require('pouchdb-binary-utils');\nvar pouchdbMd5 = require('pouchdb-md5');\nvar pouchdbErrors = require('pouchdb-errors');\nvar pouchdbMerge = require('pouchdb-merge');\n\nfunction allDocsKeysQuery(api, opts) {\n  var keys = opts.keys;\n  var finalResults = {\n    offset: opts.skip\n  };\n  return Promise.all(keys.map(function (key) {\n    var subOpts = Object.assign({key, deleted: 'ok'}, opts);\n    ['limit', 'skip', 'keys'].forEach(function (optKey) {\n      delete subOpts[optKey];\n    });\n    return new Promise(function (resolve, reject) {\n      api._allDocs(subOpts, function (err, res) {\n        /* istanbul ignore if */\n        if (err) {\n          return reject(err);\n        }\n        /* istanbul ignore if */\n        if (opts.update_seq && res.update_seq !== undefined) {\n          finalResults.update_seq = res.update_seq;\n        }\n        finalResults.total_rows = res.total_rows;\n        resolve(res.rows[0] || {key, error: 'not_found'});\n      });\n    });\n  })).then(function (results) {\n    finalResults.rows = results;\n    return finalResults;\n  });\n}\n\n//\n// Blobs are not supported in all versions of IndexedDB, notably\n// Chrome <37, Android <5 and (some?) webkit-based browsers.\n// In those versions, storing a blob will throw.\n//\n// Example Webkit error:\n// > DataCloneError: Failed to store record in an IDBObjectStore: BlobURLs are not yet supported.\n//\n// Various other blob bugs exist in Chrome v37-42 (inclusive).\n// Detecting them is expensive and confusing to users, and Chrome 37-42\n// is at very low usage worldwide, so we do a hacky userAgent check instead.\n//\n// content-type bug: https://code.google.com/p/chromium/issues/detail?id=408120\n// 404 bug: https://code.google.com/p/chromium/issues/detail?id=447916\n// FileReader bug: https://code.google.com/p/chromium/issues/detail?id=447836\n//\nfunction checkBlobSupport(txn, store, docIdOrCreateDoc) {\n  return new Promise(function (resolve) {\n    var blob = pouchdbBinaryUtils.blob(['']);\n\n    let req;\n    if (typeof docIdOrCreateDoc === 'function') {\n      // Store may require a specific key path, in which case we can't store the\n      // blob directly in the store.\n      const createDoc = docIdOrCreateDoc;\n      const doc = createDoc(blob);\n      req = txn.objectStore(store).put(doc);\n    } else {\n      const docId = docIdOrCreateDoc;\n      req = txn.objectStore(store).put(blob, docId);\n    }\n\n    req.onsuccess = function () {\n      var matchedChrome = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n      var matchedEdge = navigator.userAgent.match(/Edge\\//);\n      // MS Edge pretends to be Chrome 42:\n      // https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx\n      resolve(matchedEdge || !matchedChrome ||\n        parseInt(matchedChrome[1], 10) >= 43);\n    };\n\n    req.onerror = txn.onabort = function (e) {\n      // If the transaction aborts now its due to not being able to\n      // write to the database, likely due to the disk being full\n      e.preventDefault();\n      e.stopPropagation();\n      resolve(false);\n    };\n  }).catch(function () {\n    return false; // error, so assume unsupported\n  });\n}\n\nfunction toObject(array) {\n  return array.reduce(function (obj, item) {\n    obj[item] = true;\n    return obj;\n  }, {});\n}\n// List of top level reserved words for doc\nvar reservedWords = toObject([\n  '_id',\n  '_rev',\n  '_access',\n  '_attachments',\n  '_deleted',\n  '_revisions',\n  '_revs_info',\n  '_conflicts',\n  '_deleted_conflicts',\n  '_local_seq',\n  '_rev_tree',\n  // replication documents\n  '_replication_id',\n  '_replication_state',\n  '_replication_state_time',\n  '_replication_state_reason',\n  '_replication_stats',\n  // Specific to Couchbase Sync Gateway\n  '_removed'\n]);\n\n// List of reserved words that should end up in the document\nvar dataWords = toObject([\n  '_access',\n  '_attachments',\n  // replication documents\n  '_replication_id',\n  '_replication_state',\n  '_replication_state_time',\n  '_replication_state_reason',\n  '_replication_stats'\n]);\n\nfunction parseRevisionInfo(rev) {\n  if (!/^\\d+-/.test(rev)) {\n    return pouchdbErrors.createError(pouchdbErrors.INVALID_REV);\n  }\n  var idx = rev.indexOf('-');\n  var left = rev.substring(0, idx);\n  var right = rev.substring(idx + 1);\n  return {\n    prefix: parseInt(left, 10),\n    id: right\n  };\n}\n\nfunction makeRevTreeFromRevisions(revisions, opts) {\n  var pos = revisions.start - revisions.ids.length + 1;\n\n  var revisionIds = revisions.ids;\n  var ids = [revisionIds[0], opts, []];\n\n  for (var i = 1, len = revisionIds.length; i < len; i++) {\n    ids = [revisionIds[i], {status: 'missing'}, [ids]];\n  }\n\n  return [{\n    pos,\n    ids\n  }];\n}\n\n// Preprocess documents, parse their revisions, assign an id and a\n// revision for new writes that are missing them, etc\nfunction parseDoc(doc, newEdits, dbOpts) {\n  if (!dbOpts) {\n    dbOpts = {\n      deterministic_revs: true\n    };\n  }\n\n  var nRevNum;\n  var newRevId;\n  var revInfo;\n  var opts = {status: 'available'};\n  if (doc._deleted) {\n    opts.deleted = true;\n  }\n\n  if (newEdits) {\n    if (!doc._id) {\n      doc._id = pouchdbUtils.uuid();\n    }\n    newRevId = pouchdbUtils.rev(doc, dbOpts.deterministic_revs);\n    if (doc._rev) {\n      revInfo = parseRevisionInfo(doc._rev);\n      if (revInfo.error) {\n        return revInfo;\n      }\n      doc._rev_tree = [{\n        pos: revInfo.prefix,\n        ids: [revInfo.id, {status: 'missing'}, [[newRevId, opts, []]]]\n      }];\n      nRevNum = revInfo.prefix + 1;\n    } else {\n      doc._rev_tree = [{\n        pos: 1,\n        ids : [newRevId, opts, []]\n      }];\n      nRevNum = 1;\n    }\n  } else {\n    if (doc._revisions) {\n      doc._rev_tree = makeRevTreeFromRevisions(doc._revisions, opts);\n      nRevNum = doc._revisions.start;\n      newRevId = doc._revisions.ids[0];\n    }\n    if (!doc._rev_tree) {\n      revInfo = parseRevisionInfo(doc._rev);\n      if (revInfo.error) {\n        return revInfo;\n      }\n      nRevNum = revInfo.prefix;\n      newRevId = revInfo.id;\n      doc._rev_tree = [{\n        pos: nRevNum,\n        ids: [newRevId, opts, []]\n      }];\n    }\n  }\n\n  pouchdbUtils.invalidIdError(doc._id);\n\n  doc._rev = nRevNum + '-' + newRevId;\n\n  var result = {metadata : {}, data : {}};\n  for (var key in doc) {\n    /* istanbul ignore else */\n    if (Object.prototype.hasOwnProperty.call(doc, key)) {\n      var specialKey = key[0] === '_';\n      if (specialKey && !reservedWords[key]) {\n        var error = pouchdbErrors.createError(pouchdbErrors.DOC_VALIDATION, key);\n        error.message = pouchdbErrors.DOC_VALIDATION.message + ': ' + key;\n        throw error;\n      } else if (specialKey && !dataWords[key]) {\n        result.metadata[key.slice(1)] = doc[key];\n      } else {\n        result.data[key] = doc[key];\n      }\n    }\n  }\n  return result;\n}\n\nfunction parseBase64(data) {\n  try {\n    return pouchdbBinaryUtils.atob(data);\n  } catch (e) {\n    var err = pouchdbErrors.createError(pouchdbErrors.BAD_ARG,\n      'Attachment is not a valid base64 string');\n    return {error: err};\n  }\n}\n\nfunction preprocessString(att, blobType, callback) {\n  var asBinary = parseBase64(att.data);\n  if (asBinary.error) {\n    return callback(asBinary.error);\n  }\n\n  att.length = asBinary.length;\n  if (blobType === 'blob') {\n    att.data = pouchdbBinaryUtils.binaryStringToBlobOrBuffer(asBinary, att.content_type);\n  } else if (blobType === 'base64') {\n    att.data = pouchdbBinaryUtils.btoa(asBinary);\n  } else { // binary\n    att.data = asBinary;\n  }\n  pouchdbMd5.binaryMd5(asBinary, function (result) {\n    att.digest = 'md5-' + result;\n    callback();\n  });\n}\n\nfunction preprocessBlob(att, blobType, callback) {\n  pouchdbMd5.binaryMd5(att.data, function (md5) {\n    att.digest = 'md5-' + md5;\n    // size is for blobs (browser), length is for buffers (node)\n    att.length = att.data.size || att.data.length || 0;\n    if (blobType === 'binary') {\n      pouchdbBinaryUtils.blobOrBufferToBinaryString(att.data, function (binString) {\n        att.data = binString;\n        callback();\n      });\n    } else if (blobType === 'base64') {\n      pouchdbBinaryUtils.blobOrBufferToBase64(att.data, function (b64) {\n        att.data = b64;\n        callback();\n      });\n    } else {\n      callback();\n    }\n  });\n}\n\nfunction preprocessAttachment(att, blobType, callback) {\n  if (att.stub) {\n    return callback();\n  }\n  if (typeof att.data === 'string') { // input is a base64 string\n    preprocessString(att, blobType, callback);\n  } else { // input is a blob\n    preprocessBlob(att, blobType, callback);\n  }\n}\n\nfunction preprocessAttachments(docInfos, blobType, callback) {\n\n  if (!docInfos.length) {\n    return callback();\n  }\n\n  var docv = 0;\n  var overallErr;\n\n  docInfos.forEach(function (docInfo) {\n    var attachments = docInfo.data && docInfo.data._attachments ?\n      Object.keys(docInfo.data._attachments) : [];\n    var recv = 0;\n\n    if (!attachments.length) {\n      return done();\n    }\n\n    function processedAttachment(err) {\n      overallErr = err;\n      recv++;\n      if (recv === attachments.length) {\n        done();\n      }\n    }\n\n    for (var key in docInfo.data._attachments) {\n      if (Object.prototype.hasOwnProperty.call(docInfo.data._attachments, key)) {\n        preprocessAttachment(docInfo.data._attachments[key],\n          blobType, processedAttachment);\n      }\n    }\n  });\n\n  function done() {\n    docv++;\n    if (docInfos.length === docv) {\n      if (overallErr) {\n        callback(overallErr);\n      } else {\n        callback();\n      }\n    }\n  }\n}\n\nfunction updateDoc(revLimit, prev, docInfo, results,\n                   i, cb, writeDoc, newEdits) {\n\n  if (pouchdbMerge.revExists(prev.rev_tree, docInfo.metadata.rev) && !newEdits) {\n    results[i] = docInfo;\n    return cb();\n  }\n\n  // sometimes this is pre-calculated. historically not always\n  var previousWinningRev = prev.winningRev || pouchdbMerge.winningRev(prev);\n  var previouslyDeleted = 'deleted' in prev ? prev.deleted :\n    pouchdbMerge.isDeleted(prev, previousWinningRev);\n  var deleted = 'deleted' in docInfo.metadata ? docInfo.metadata.deleted :\n    pouchdbMerge.isDeleted(docInfo.metadata);\n  var isRoot = /^1-/.test(docInfo.metadata.rev);\n\n  if (previouslyDeleted && !deleted && newEdits && isRoot) {\n    var newDoc = docInfo.data;\n    newDoc._rev = previousWinningRev;\n    newDoc._id = docInfo.metadata.id;\n    docInfo = parseDoc(newDoc, newEdits);\n  }\n\n  var merged = pouchdbMerge.merge(prev.rev_tree, docInfo.metadata.rev_tree[0], revLimit);\n\n  var inConflict = newEdits && ((\n    (previouslyDeleted && deleted && merged.conflicts !== 'new_leaf') ||\n    (!previouslyDeleted && merged.conflicts !== 'new_leaf') ||\n    (previouslyDeleted && !deleted && merged.conflicts === 'new_branch')));\n\n  if (inConflict) {\n    var err = pouchdbErrors.createError(pouchdbErrors.REV_CONFLICT);\n    results[i] = err;\n    return cb();\n  }\n\n  var newRev = docInfo.metadata.rev;\n  docInfo.metadata.rev_tree = merged.tree;\n  docInfo.stemmedRevs = merged.stemmedRevs || [];\n  /* istanbul ignore else */\n  if (prev.rev_map) {\n    docInfo.metadata.rev_map = prev.rev_map; // used only by leveldb\n  }\n\n  // recalculate\n  var winningRev = pouchdbMerge.winningRev(docInfo.metadata);\n  var winningRevIsDeleted = pouchdbMerge.isDeleted(docInfo.metadata, winningRev);\n\n  // calculate the total number of documents that were added/removed,\n  // from the perspective of total_rows/doc_count\n  var delta = (previouslyDeleted === winningRevIsDeleted) ? 0 :\n    previouslyDeleted < winningRevIsDeleted ? -1 : 1;\n\n  var newRevIsDeleted;\n  if (newRev === winningRev) {\n    // if the new rev is the same as the winning rev, we can reuse that value\n    newRevIsDeleted = winningRevIsDeleted;\n  } else {\n    // if they're not the same, then we need to recalculate\n    newRevIsDeleted = pouchdbMerge.isDeleted(docInfo.metadata, newRev);\n  }\n\n  writeDoc(docInfo, winningRev, winningRevIsDeleted, newRevIsDeleted,\n    true, delta, i, cb);\n}\n\nfunction rootIsMissing(docInfo) {\n  return docInfo.metadata.rev_tree[0].ids[1].status === 'missing';\n}\n\nfunction processDocs(revLimit, docInfos, api, fetchedDocs, tx, results,\n                     writeDoc, opts, overallCallback) {\n\n  // Default to 1000 locally\n  revLimit = revLimit || 1000;\n\n  function insertDoc(docInfo, resultsIdx, callback) {\n    // Cant insert new deleted documents\n    var winningRev = pouchdbMerge.winningRev(docInfo.metadata);\n    var deleted = pouchdbMerge.isDeleted(docInfo.metadata, winningRev);\n    if ('was_delete' in opts && deleted) {\n      results[resultsIdx] = pouchdbErrors.createError(pouchdbErrors.MISSING_DOC, 'deleted');\n      return callback();\n    }\n\n    // 4712 - detect whether a new document was inserted with a _rev\n    var inConflict = newEdits && rootIsMissing(docInfo);\n\n    if (inConflict) {\n      var err = pouchdbErrors.createError(pouchdbErrors.REV_CONFLICT);\n      results[resultsIdx] = err;\n      return callback();\n    }\n\n    var delta = deleted ? 0 : 1;\n\n    writeDoc(docInfo, winningRev, deleted, deleted, false,\n      delta, resultsIdx, callback);\n  }\n\n  var newEdits = opts.new_edits;\n  var idsToDocs = new Map();\n\n  var docsDone = 0;\n  var docsToDo = docInfos.length;\n\n  function checkAllDocsDone() {\n    if (++docsDone === docsToDo && overallCallback) {\n      overallCallback();\n    }\n  }\n\n  docInfos.forEach(function (currentDoc, resultsIdx) {\n\n    if (currentDoc._id && pouchdbMerge.isLocalId(currentDoc._id)) {\n      var fun = currentDoc._deleted ? '_removeLocal' : '_putLocal';\n      api[fun](currentDoc, {ctx: tx}, function (err, res) {\n        results[resultsIdx] = err || res;\n        checkAllDocsDone();\n      });\n      return;\n    }\n\n    var id = currentDoc.metadata.id;\n    if (idsToDocs.has(id)) {\n      docsToDo--; // duplicate\n      idsToDocs.get(id).push([currentDoc, resultsIdx]);\n    } else {\n      idsToDocs.set(id, [[currentDoc, resultsIdx]]);\n    }\n  });\n\n  // in the case of new_edits, the user can provide multiple docs\n  // with the same id. these need to be processed sequentially\n  idsToDocs.forEach(function (docs, id) {\n    var numDone = 0;\n\n    function docWritten() {\n      if (++numDone < docs.length) {\n        nextDoc();\n      } else {\n        checkAllDocsDone();\n      }\n    }\n    function nextDoc() {\n      var value = docs[numDone];\n      var currentDoc = value[0];\n      var resultsIdx = value[1];\n\n      if (fetchedDocs.has(id)) {\n        updateDoc(revLimit, fetchedDocs.get(id), currentDoc, results,\n          resultsIdx, docWritten, writeDoc, newEdits);\n      } else {\n        // Ensure stemming applies to new writes as well\n        var merged = pouchdbMerge.merge([], currentDoc.metadata.rev_tree[0], revLimit);\n        currentDoc.metadata.rev_tree = merged.tree;\n        currentDoc.stemmedRevs = merged.stemmedRevs || [];\n        insertDoc(currentDoc, resultsIdx, docWritten);\n      }\n    }\n    nextDoc();\n  });\n}\n\nexports.invalidIdError = pouchdbUtils.invalidIdError;\nexports.normalizeDdocFunctionName = pouchdbUtils.normalizeDdocFunctionName;\nexports.parseDdocFunctionName = pouchdbUtils.parseDdocFunctionName;\nexports.isDeleted = pouchdbMerge.isDeleted;\nexports.isLocalId = pouchdbMerge.isLocalId;\nexports.allDocsKeysQuery = allDocsKeysQuery;\nexports.checkBlobSupport = checkBlobSupport;\nexports.parseDoc = parseDoc;\nexports.preprocessAttachments = preprocessAttachments;\nexports.processDocs = processDocs;\nexports.updateDoc = updateDoc;\n"]}