@vue-skuilder/platform-ui 0.1.33 → 0.1.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/assets/{About-C1rcp0Ex.js → About-BpqIdlZQ.js} +2 -2
  2. package/dist/assets/{About-C1rcp0Ex.js.map → About-BpqIdlZQ.js.map} +1 -1
  3. package/dist/assets/{AdminDashboard-BOHgXD45.js → AdminDashboard-BObO6egG.js} +2 -2
  4. package/dist/assets/{AdminDashboard-BOHgXD45.js.map → AdminDashboard-BObO6egG.js.map} +1 -1
  5. package/dist/assets/{ClassroomCtrlPanel-ezMgP7A3.js → ClassroomCtrlPanel-lgN6cdTd.js} +2 -2
  6. package/dist/assets/{ClassroomCtrlPanel-ezMgP7A3.js.map → ClassroomCtrlPanel-lgN6cdTd.js.map} +1 -1
  7. package/dist/assets/{Classrooms-CdN-ogiI.js → Classrooms-BWoQ4i1_.js} +2 -2
  8. package/dist/assets/{Classrooms-CdN-ogiI.js.map → Classrooms-BWoQ4i1_.js.map} +1 -1
  9. package/dist/assets/{CourseRouter-BKHj3HHh.js → CourseRouter-CODD0Qm5.js} +2 -2
  10. package/dist/assets/{CourseRouter-BKHj3HHh.js.map → CourseRouter-CODD0Qm5.js.map} +1 -1
  11. package/dist/assets/{Courses-DTsQz202.js → Courses-ClDdLQUO.js} +2 -2
  12. package/dist/assets/{Courses-DTsQz202.js.map → Courses-ClDdLQUO.js.map} +1 -1
  13. package/dist/assets/{DataInputFormTester-BC2ZDakI.js → DataInputFormTester-ywHjm2yC.js} +2 -2
  14. package/dist/assets/{DataInputFormTester-BC2ZDakI.js.map → DataInputFormTester-ywHjm2yC.js.map} +1 -1
  15. package/dist/assets/{EloModeration-DqViuzI8.js → EloModeration-B6LM11G_.js} +2 -2
  16. package/dist/assets/{EloModeration-DqViuzI8.js.map → EloModeration-B6LM11G_.js.map} +1 -1
  17. package/dist/assets/{JoinCode-BjbhKTgK.js → JoinCode-DgPD_OFL.js} +2 -2
  18. package/dist/assets/{JoinCode-BjbhKTgK.js.map → JoinCode-DgPD_OFL.js.map} +1 -1
  19. package/dist/assets/{NewCourseDialog-4YsIKoUU.js → NewCourseDialog-DhwvBT3y.js} +2 -2
  20. package/dist/assets/{NewCourseDialog-4YsIKoUU.js.map → NewCourseDialog-DhwvBT3y.js.map} +1 -1
  21. package/dist/assets/{ReleaseNotes-BYXN8IZ4.js → ReleaseNotes-DtwDIIfH.js} +2 -2
  22. package/dist/assets/{ReleaseNotes-BYXN8IZ4.js.map → ReleaseNotes-DtwDIIfH.js.map} +1 -1
  23. package/dist/assets/{RequestPasswordReset-Zxt4oKHx.js → RequestPasswordReset-DBv0XCIk.js} +2 -2
  24. package/dist/assets/{RequestPasswordReset-Zxt4oKHx.js.map → RequestPasswordReset-DBv0XCIk.js.map} +1 -1
  25. package/dist/assets/{ResetPassword-rAc69I0Q.js → ResetPassword-BtBplqsQ.js} +2 -2
  26. package/dist/assets/{ResetPassword-rAc69I0Q.js.map → ResetPassword-BtBplqsQ.js.map} +1 -1
  27. package/dist/assets/{Study-DJlTc-ZH.js → Study-D9W1DKes.js} +2 -2
  28. package/dist/assets/{Study-DJlTc-ZH.js.map → Study-D9W1DKes.js.map} +1 -1
  29. package/dist/assets/{TagInformation-CSUtrZy7.js → TagInformation-DgUkKxoU.js} +2 -2
  30. package/dist/assets/{TagInformation-CSUtrZy7.js.map → TagInformation-DgUkKxoU.js.map} +1 -1
  31. package/dist/assets/{User-D2R6CphB.js → User-DorFkRx_.js} +2 -2
  32. package/dist/assets/{User-D2R6CphB.js.map → User-DorFkRx_.js.map} +1 -1
  33. package/dist/assets/{UserStats-BgnHXg6C.js → UserStats-ck9Oh4qt.js} +2 -2
  34. package/dist/assets/{UserStats-BgnHXg6C.js.map → UserStats-ck9Oh4qt.js.map} +1 -1
  35. package/dist/assets/{VerifyEmail-BLfciV-4.js → VerifyEmail-BYt5xfhm.js} +2 -2
  36. package/dist/assets/{VerifyEmail-BLfciV-4.js.map → VerifyEmail-BYt5xfhm.js.map} +1 -1
  37. package/dist/assets/{common-ui.es-I814CYyx.js → common-ui.es-BrXWBn7p.js} +6 -6
  38. package/dist/assets/common-ui.es-BrXWBn7p.js.map +1 -0
  39. package/dist/assets/common-ui.es-DKUQOgQx.js +1 -0
  40. package/dist/assets/dist-5cG6aSxW.js +1 -0
  41. package/dist/assets/{dist-DkeESCP4.js → dist-CzLl7g6t.js} +11 -10
  42. package/dist/assets/dist-CzLl7g6t.js.map +1 -0
  43. package/dist/assets/{dist-BwVFN4Xe.js → dist-D5-LrzD6.js} +3 -3
  44. package/dist/assets/{dist-BwVFN4Xe.js.map → dist-D5-LrzD6.js.map} +1 -1
  45. package/dist/assets/dist-y6_rrqhr.js +1 -0
  46. package/dist/assets/{edit-ui.es-Cs9EI-Ey.js → edit-ui.es-C9MhXwkt.js} +2 -2
  47. package/dist/assets/{edit-ui.es-Cs9EI-Ey.js.map → edit-ui.es-C9MhXwkt.js.map} +1 -1
  48. package/dist/assets/edit-ui.es-DT9CMaNG.js +1 -0
  49. package/dist/assets/{index-DotoyByQ.css → index-C8gy3Ea0.css} +1 -1
  50. package/dist/assets/{index-CF-NaZ2k.js → index-DUZItsH-.js} +4 -4
  51. package/dist/assets/{index-CF-NaZ2k.js.map → index-DUZItsH-.js.map} +1 -1
  52. package/dist/assets/{server-Cl1ZnRx7.js → server-Db_WegNj.js} +2 -2
  53. package/dist/assets/{server-Cl1ZnRx7.js.map → server-Db_WegNj.js.map} +1 -1
  54. package/dist/index.html +4 -4
  55. package/dist/sw.js +1 -1
  56. package/dist/sw.js.map +1 -1
  57. package/package.json +8 -8
  58. package/dist/assets/common-ui.es-B6tKmOxI.js +0 -1
  59. package/dist/assets/common-ui.es-I814CYyx.js.map +0 -1
  60. package/dist/assets/dist-BjDnRspm.js +0 -1
  61. package/dist/assets/dist-CFgc27Ho.js +0 -1
  62. package/dist/assets/dist-DkeESCP4.js.map +0 -1
  63. package/dist/assets/edit-ui.es-C_I54ckd.js +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dist-CzLl7g6t.js","names":["getRandomValues","rnds8","rng","validate","REGEX","byteToHex","stringify","validate","v4","rng","stringify","isBinaryObject","cloneBinaryObject","funcToString","objectCtorString","isPlainObject","clone","pick","hasLocal","nextTick","EE","guardedConsole","PouchError","MISSING_BULK_DOCS","MISSING_DOC","REV_CONFLICT","INVALID_ID","MISSING_ID","RESERVED_ID","UNKNOWN_ERROR","BAD_ARG","QUERY_PARSE_ERROR","DOC_VALIDATION","BAD_REQUEST","NOT_AN_OBJECT","IDB_ERROR","INVALID_REV","MISSING_STUB","createError","generateErrorFromResponse","isRemote","upsert","tryAndPut","thisAtob","createBlob","binaryStringToArrayBuffer","binStringToBluffer","b64ToBluffer","setImmediateShim","Md5","stringMd5","v4","TaskQueue","h","getFieldFromDoc","compare","parseField","combinationFields","isCombinationalField","getKey","getValue","mergeAndedSelectors","mergeGtGte","mergeLtLte","mergeNe","mergeEq","mergeRegex","mergeAndedSelectorsNested","isAndInSelector","massageSelector","normalizeArrayOperators","pad","padLeft","MIN_MAGNITUDE","MAGNITUDE_DIGITS","SEP","collate","normalizeKey","collationIndex","stringCollate","arrayCollate","objectCollate","indexify","numToIndexableString","toIndexableString","parseNumber","pop","parseIndexableString","createFieldSorter","filterInMemoryFields","rowFilter","matchCominationalSelector","matchSelector","match","matchers","fieldExists","fieldIsNotUndefined","modField","arrayContainsValue","arrayContainsAllValues","arraySize","regexMatch","typeMatch","matchesSelector","CHANGES_BATCH_SIZE","QueryParseError","NotFoundError","BuiltInError","promisedCallback","callbackify","fin","sequentialize","uniq","mapToKeysArray","log","TaskQueue$1","stringify","createViewSignature","createView","persistentQueues","tempViewQueue","CHANGES_BATCH_SIZE$1","parseViewName","isGenOne","emitError","createAbstractMapReduce","mapper","reducer","ddocValidator","Md5","uniq","base64StringToBlobOrBuffer","Headers","uniq","Headers","abstractMapReduce","plugin","Headers","native","exports","PouchDBFind","PouchDBAuth","path","os","fs","moment","moment2","uuidv4","toCourseElo2","moment3","toCourseElo3","toCourseElo4","toCourseElo5","toCourseElo6","blankCourseElo2","moment4","Status2","process2","Status3","moment6","Status4","hasActiveFilter2","Status5","NameSpacer2","moment7","moment8","toCourseElo7","isTaggedPerformance2","toCourseElo8"],"sources":["../../../../node_modules/spark-md5/spark-md5.js","../../../../node_modules/pouchdb/node_modules/uuid/dist/esm-browser/rng.js","../../../../node_modules/pouchdb/node_modules/uuid/dist/esm-browser/regex.js","../../../../node_modules/pouchdb/node_modules/uuid/dist/esm-browser/validate.js","../../../../node_modules/pouchdb/node_modules/uuid/dist/esm-browser/stringify.js","../../../../node_modules/pouchdb/node_modules/uuid/dist/esm-browser/v4.js","../../../../node_modules/vuvuzela/index.js","../../../../node_modules/events/events.js","../../../../node_modules/pouchdb/lib/index-browser.es.js","../../../../node_modules/pouchdb-errors/lib/index.es.js","../../../../node_modules/pouchdb-fetch/lib/index-browser.es.js","../../../../node_modules/pouchdb-binary-utils/lib/index-browser.es.js","../../../../node_modules/pouchdb-collate/lib/index.es.js","../../../../node_modules/pouchdb-md5/lib/index-browser.es.js","../../../../node_modules/pouchdb-utils/lib/index-browser.es.js","../../../../node_modules/pouchdb-mapreduce-utils/lib/index.es.js","../../../../node_modules/pouchdb-abstract-mapreduce/lib/index.es.js","../../../../node_modules/pouchdb-selector-core/lib/index.es.js","../../../../node_modules/pouchdb-find/lib/index-browser.es.js","../../../../node_modules/@nilock2/pouchdb-authentication/lib/index.es.js","../../../../node_modules/uuid/dist/esm-browser/stringify.js","../../../../node_modules/uuid/dist/esm-browser/rng.js","../../../../node_modules/uuid/dist/esm-browser/native.js","../../../../node_modules/uuid/dist/esm-browser/v4.js","../../../../node_modules/cross-fetch/dist/browser-ponyfill.js","../../../../node_modules/process/browser.js","../../../db/dist/index.mjs"],"sourcesContent":["(function (factory) {\n if (typeof exports === 'object') {\n // Node/CommonJS\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n // AMD\n define(factory);\n } else {\n // Browser globals (with support for web workers)\n var glob;\n\n try {\n glob = window;\n } catch (e) {\n glob = self;\n }\n\n glob.SparkMD5 = factory();\n }\n}(function (undefined) {\n\n 'use strict';\n\n /*\n * Fastest md5 implementation around (JKM md5).\n * Credits: Joseph Myers\n *\n * @see http://www.myersdaily.org/joseph/javascript/md5-text.html\n * @see http://jsperf.com/md5-shootout/7\n */\n\n /* this function is much faster,\n so if possible we use it. Some IEs\n are the only ones I know of that\n need the idiotic second function,\n generated by an if clause. */\n var add32 = function (a, b) {\n return (a + b) & 0xFFFFFFFF;\n },\n hex_chr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];\n\n\n function cmn(q, a, b, x, s, t) {\n a = add32(add32(a, q), add32(x, t));\n return add32((a << s) | (a >>> (32 - s)), b);\n }\n\n function md5cycle(x, k) {\n var a = x[0],\n b = x[1],\n c = x[2],\n d = x[3];\n\n a += (b & c | ~b & d) + k[0] - 680876936 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[1] - 389564586 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[2] + 606105819 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[3] - 1044525330 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[4] - 176418897 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[5] + 1200080426 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[6] - 1473231341 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[7] - 45705983 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[8] + 1770035416 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[9] - 1958414417 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[10] - 42063 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[11] - 1990404162 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[12] + 1804603682 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[13] - 40341101 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[14] - 1502002290 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[15] + 1236535329 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n\n a += (b & d | c & ~d) + k[1] - 165796510 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[6] - 1069501632 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[11] + 643717713 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[0] - 373897302 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[5] - 701558691 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[10] + 38016083 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[15] - 660478335 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[4] - 405537848 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[9] + 568446438 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[14] - 1019803690 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[3] - 187363961 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[8] + 1163531501 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[13] - 1444681467 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[2] - 51403784 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[7] + 1735328473 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[12] - 1926607734 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n\n a += (b ^ c ^ d) + k[5] - 378558 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[8] - 2022574463 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[11] + 1839030562 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[14] - 35309556 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[1] - 1530992060 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[4] + 1272893353 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[7] - 155497632 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[10] - 1094730640 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[13] + 681279174 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[0] - 358537222 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[3] - 722521979 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[6] + 76029189 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[9] - 640364487 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[12] - 421815835 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[15] + 530742520 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[2] - 995338651 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n\n a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;\n b = (b << 21 |b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;\n b = (b << 21 |b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;\n b = (b << 21 |b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;\n b = (b << 21 | b >>> 11) + c | 0;\n\n x[0] = a + x[0] | 0;\n x[1] = b + x[1] | 0;\n x[2] = c + x[2] | 0;\n x[3] = d + x[3] | 0;\n }\n\n function md5blk(s) {\n var md5blks = [],\n i; /* Andy King said do it this way. */\n\n for (i = 0; i < 64; i += 4) {\n md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);\n }\n return md5blks;\n }\n\n function md5blk_array(a) {\n var md5blks = [],\n i; /* Andy King said do it this way. */\n\n for (i = 0; i < 64; i += 4) {\n md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);\n }\n return md5blks;\n }\n\n function md51(s) {\n var n = s.length,\n state = [1732584193, -271733879, -1732584194, 271733878],\n i,\n length,\n tail,\n tmp,\n lo,\n hi;\n\n for (i = 64; i <= n; i += 64) {\n md5cycle(state, md5blk(s.substring(i - 64, i)));\n }\n s = s.substring(i - 64);\n length = s.length;\n tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n for (i = 0; i < length; i += 1) {\n tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3);\n }\n tail[i >> 2] |= 0x80 << ((i % 4) << 3);\n if (i > 55) {\n md5cycle(state, tail);\n for (i = 0; i < 16; i += 1) {\n tail[i] = 0;\n }\n }\n\n // Beware that the final length might not fit in 32 bits so we take care of that\n tmp = n * 8;\n tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n lo = parseInt(tmp[2], 16);\n hi = parseInt(tmp[1], 16) || 0;\n\n tail[14] = lo;\n tail[15] = hi;\n\n md5cycle(state, tail);\n return state;\n }\n\n function md51_array(a) {\n var n = a.length,\n state = [1732584193, -271733879, -1732584194, 271733878],\n i,\n length,\n tail,\n tmp,\n lo,\n hi;\n\n for (i = 64; i <= n; i += 64) {\n md5cycle(state, md5blk_array(a.subarray(i - 64, i)));\n }\n\n // Not sure if it is a bug, however IE10 will always produce a sub array of length 1\n // containing the last element of the parent array if the sub array specified starts\n // beyond the length of the parent array - weird.\n // https://connect.microsoft.com/IE/feedback/details/771452/typed-array-subarray-issue\n a = (i - 64) < n ? a.subarray(i - 64) : new Uint8Array(0);\n\n length = a.length;\n tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n for (i = 0; i < length; i += 1) {\n tail[i >> 2] |= a[i] << ((i % 4) << 3);\n }\n\n tail[i >> 2] |= 0x80 << ((i % 4) << 3);\n if (i > 55) {\n md5cycle(state, tail);\n for (i = 0; i < 16; i += 1) {\n tail[i] = 0;\n }\n }\n\n // Beware that the final length might not fit in 32 bits so we take care of that\n tmp = n * 8;\n tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n lo = parseInt(tmp[2], 16);\n hi = parseInt(tmp[1], 16) || 0;\n\n tail[14] = lo;\n tail[15] = hi;\n\n md5cycle(state, tail);\n\n return state;\n }\n\n function rhex(n) {\n var s = '',\n j;\n for (j = 0; j < 4; j += 1) {\n s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F];\n }\n return s;\n }\n\n function hex(x) {\n var i;\n for (i = 0; i < x.length; i += 1) {\n x[i] = rhex(x[i]);\n }\n return x.join('');\n }\n\n // In some cases the fast add32 function cannot be used..\n if (hex(md51('hello')) !== '5d41402abc4b2a76b9719d911017c592') {\n add32 = function (x, y) {\n var lsw = (x & 0xFFFF) + (y & 0xFFFF),\n msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return (msw << 16) | (lsw & 0xFFFF);\n };\n }\n\n // ---------------------------------------------------\n\n /**\n * ArrayBuffer slice polyfill.\n *\n * @see https://github.com/ttaubert/node-arraybuffer-slice\n */\n\n if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) {\n (function () {\n function clamp(val, length) {\n val = (val | 0) || 0;\n\n if (val < 0) {\n return Math.max(val + length, 0);\n }\n\n return Math.min(val, length);\n }\n\n ArrayBuffer.prototype.slice = function (from, to) {\n var length = this.byteLength,\n begin = clamp(from, length),\n end = length,\n num,\n target,\n targetArray,\n sourceArray;\n\n if (to !== undefined) {\n end = clamp(to, length);\n }\n\n if (begin > end) {\n return new ArrayBuffer(0);\n }\n\n num = end - begin;\n target = new ArrayBuffer(num);\n targetArray = new Uint8Array(target);\n\n sourceArray = new Uint8Array(this, begin, num);\n targetArray.set(sourceArray);\n\n return target;\n };\n })();\n }\n\n // ---------------------------------------------------\n\n /**\n * Helpers.\n */\n\n function toUtf8(str) {\n if (/[\\u0080-\\uFFFF]/.test(str)) {\n str = unescape(encodeURIComponent(str));\n }\n\n return str;\n }\n\n function utf8Str2ArrayBuffer(str, returnUInt8Array) {\n var length = str.length,\n buff = new ArrayBuffer(length),\n arr = new Uint8Array(buff),\n i;\n\n for (i = 0; i < length; i += 1) {\n arr[i] = str.charCodeAt(i);\n }\n\n return returnUInt8Array ? arr : buff;\n }\n\n function arrayBuffer2Utf8Str(buff) {\n return String.fromCharCode.apply(null, new Uint8Array(buff));\n }\n\n function concatenateArrayBuffers(first, second, returnUInt8Array) {\n var result = new Uint8Array(first.byteLength + second.byteLength);\n\n result.set(new Uint8Array(first));\n result.set(new Uint8Array(second), first.byteLength);\n\n return returnUInt8Array ? result : result.buffer;\n }\n\n function hexToBinaryString(hex) {\n var bytes = [],\n length = hex.length,\n x;\n\n for (x = 0; x < length - 1; x += 2) {\n bytes.push(parseInt(hex.substr(x, 2), 16));\n }\n\n return String.fromCharCode.apply(String, bytes);\n }\n\n // ---------------------------------------------------\n\n /**\n * SparkMD5 OOP implementation.\n *\n * Use this class to perform an incremental md5, otherwise use the\n * static methods instead.\n */\n\n function SparkMD5() {\n // call reset to init the instance\n this.reset();\n }\n\n /**\n * Appends a string.\n * A conversion will be applied if an utf8 string is detected.\n *\n * @param {String} str The string to be appended\n *\n * @return {SparkMD5} The instance itself\n */\n SparkMD5.prototype.append = function (str) {\n // Converts the string to utf8 bytes if necessary\n // Then append as binary\n this.appendBinary(toUtf8(str));\n\n return this;\n };\n\n /**\n * Appends a binary string.\n *\n * @param {String} contents The binary string to be appended\n *\n * @return {SparkMD5} The instance itself\n */\n SparkMD5.prototype.appendBinary = function (contents) {\n this._buff += contents;\n this._length += contents.length;\n\n var length = this._buff.length,\n i;\n\n for (i = 64; i <= length; i += 64) {\n md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i)));\n }\n\n this._buff = this._buff.substring(i - 64);\n\n return this;\n };\n\n /**\n * Finishes the incremental computation, reseting the internal state and\n * returning the result.\n *\n * @param {Boolean} raw True to get the raw string, false to get the hex string\n *\n * @return {String} The result\n */\n SparkMD5.prototype.end = function (raw) {\n var buff = this._buff,\n length = buff.length,\n i,\n tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n ret;\n\n for (i = 0; i < length; i += 1) {\n tail[i >> 2] |= buff.charCodeAt(i) << ((i % 4) << 3);\n }\n\n this._finish(tail, length);\n ret = hex(this._hash);\n\n if (raw) {\n ret = hexToBinaryString(ret);\n }\n\n this.reset();\n\n return ret;\n };\n\n /**\n * Resets the internal state of the computation.\n *\n * @return {SparkMD5} The instance itself\n */\n SparkMD5.prototype.reset = function () {\n this._buff = '';\n this._length = 0;\n this._hash = [1732584193, -271733879, -1732584194, 271733878];\n\n return this;\n };\n\n /**\n * Gets the internal state of the computation.\n *\n * @return {Object} The state\n */\n SparkMD5.prototype.getState = function () {\n return {\n buff: this._buff,\n length: this._length,\n hash: this._hash.slice()\n };\n };\n\n /**\n * Gets the internal state of the computation.\n *\n * @param {Object} state The state\n *\n * @return {SparkMD5} The instance itself\n */\n SparkMD5.prototype.setState = function (state) {\n this._buff = state.buff;\n this._length = state.length;\n this._hash = state.hash;\n\n return this;\n };\n\n /**\n * Releases memory used by the incremental buffer and other additional\n * resources. If you plan to use the instance again, use reset instead.\n */\n SparkMD5.prototype.destroy = function () {\n delete this._hash;\n delete this._buff;\n delete this._length;\n };\n\n /**\n * Finish the final calculation based on the tail.\n *\n * @param {Array} tail The tail (will be modified)\n * @param {Number} length The length of the remaining buffer\n */\n SparkMD5.prototype._finish = function (tail, length) {\n var i = length,\n tmp,\n lo,\n hi;\n\n tail[i >> 2] |= 0x80 << ((i % 4) << 3);\n if (i > 55) {\n md5cycle(this._hash, tail);\n for (i = 0; i < 16; i += 1) {\n tail[i] = 0;\n }\n }\n\n // Do the final computation based on the tail and length\n // Beware that the final length may not fit in 32 bits so we take care of that\n tmp = this._length * 8;\n tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n lo = parseInt(tmp[2], 16);\n hi = parseInt(tmp[1], 16) || 0;\n\n tail[14] = lo;\n tail[15] = hi;\n md5cycle(this._hash, tail);\n };\n\n /**\n * Performs the md5 hash on a string.\n * A conversion will be applied if utf8 string is detected.\n *\n * @param {String} str The string\n * @param {Boolean} [raw] True to get the raw string, false to get the hex string\n *\n * @return {String} The result\n */\n SparkMD5.hash = function (str, raw) {\n // Converts the string to utf8 bytes if necessary\n // Then compute it using the binary function\n return SparkMD5.hashBinary(toUtf8(str), raw);\n };\n\n /**\n * Performs the md5 hash on a binary string.\n *\n * @param {String} content The binary string\n * @param {Boolean} [raw] True to get the raw string, false to get the hex string\n *\n * @return {String} The result\n */\n SparkMD5.hashBinary = function (content, raw) {\n var hash = md51(content),\n ret = hex(hash);\n\n return raw ? hexToBinaryString(ret) : ret;\n };\n\n // ---------------------------------------------------\n\n /**\n * SparkMD5 OOP implementation for array buffers.\n *\n * Use this class to perform an incremental md5 ONLY for array buffers.\n */\n SparkMD5.ArrayBuffer = function () {\n // call reset to init the instance\n this.reset();\n };\n\n /**\n * Appends an array buffer.\n *\n * @param {ArrayBuffer} arr The array to be appended\n *\n * @return {SparkMD5.ArrayBuffer} The instance itself\n */\n SparkMD5.ArrayBuffer.prototype.append = function (arr) {\n var buff = concatenateArrayBuffers(this._buff.buffer, arr, true),\n length = buff.length,\n i;\n\n this._length += arr.byteLength;\n\n for (i = 64; i <= length; i += 64) {\n md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i)));\n }\n\n this._buff = (i - 64) < length ? new Uint8Array(buff.buffer.slice(i - 64)) : new Uint8Array(0);\n\n return this;\n };\n\n /**\n * Finishes the incremental computation, reseting the internal state and\n * returning the result.\n *\n * @param {Boolean} raw True to get the raw string, false to get the hex string\n *\n * @return {String} The result\n */\n SparkMD5.ArrayBuffer.prototype.end = function (raw) {\n var buff = this._buff,\n length = buff.length,\n tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n i,\n ret;\n\n for (i = 0; i < length; i += 1) {\n tail[i >> 2] |= buff[i] << ((i % 4) << 3);\n }\n\n this._finish(tail, length);\n ret = hex(this._hash);\n\n if (raw) {\n ret = hexToBinaryString(ret);\n }\n\n this.reset();\n\n return ret;\n };\n\n /**\n * Resets the internal state of the computation.\n *\n * @return {SparkMD5.ArrayBuffer} The instance itself\n */\n SparkMD5.ArrayBuffer.prototype.reset = function () {\n this._buff = new Uint8Array(0);\n this._length = 0;\n this._hash = [1732584193, -271733879, -1732584194, 271733878];\n\n return this;\n };\n\n /**\n * Gets the internal state of the computation.\n *\n * @return {Object} The state\n */\n SparkMD5.ArrayBuffer.prototype.getState = function () {\n var state = SparkMD5.prototype.getState.call(this);\n\n // Convert buffer to a string\n state.buff = arrayBuffer2Utf8Str(state.buff);\n\n return state;\n };\n\n /**\n * Gets the internal state of the computation.\n *\n * @param {Object} state The state\n *\n * @return {SparkMD5.ArrayBuffer} The instance itself\n */\n SparkMD5.ArrayBuffer.prototype.setState = function (state) {\n // Convert string to buffer\n state.buff = utf8Str2ArrayBuffer(state.buff, true);\n\n return SparkMD5.prototype.setState.call(this, state);\n };\n\n SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;\n\n SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;\n\n /**\n * Performs the md5 hash on an array buffer.\n *\n * @param {ArrayBuffer} arr The array buffer\n * @param {Boolean} [raw] True to get the raw string, false to get the hex one\n *\n * @return {String} The result\n */\n SparkMD5.ArrayBuffer.hash = function (arr, raw) {\n var hash = md51_array(new Uint8Array(arr)),\n ret = hex(hash);\n\n return raw ? hexToBinaryString(ret) : ret;\n };\n\n return SparkMD5;\n}));\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","'use strict';\n\n/**\n * Stringify/parse functions that don't operate\n * recursively, so they avoid call stack exceeded\n * errors.\n */\nexports.stringify = function stringify(input) {\n var queue = [];\n queue.push({obj: input});\n\n var res = '';\n var next, obj, prefix, val, i, arrayPrefix, keys, k, key, value, objPrefix;\n while ((next = queue.pop())) {\n obj = next.obj;\n prefix = next.prefix || '';\n val = next.val || '';\n res += prefix;\n if (val) {\n res += val;\n } else if (typeof obj !== 'object') {\n res += typeof obj === 'undefined' ? null : JSON.stringify(obj);\n } else if (obj === null) {\n res += 'null';\n } else if (Array.isArray(obj)) {\n queue.push({val: ']'});\n for (i = obj.length - 1; i >= 0; i--) {\n arrayPrefix = i === 0 ? '' : ',';\n queue.push({obj: obj[i], prefix: arrayPrefix});\n }\n queue.push({val: '['});\n } else { // object\n keys = [];\n for (k in obj) {\n if (obj.hasOwnProperty(k)) {\n keys.push(k);\n }\n }\n queue.push({val: '}'});\n for (i = keys.length - 1; i >= 0; i--) {\n key = keys[i];\n value = obj[key];\n objPrefix = (i > 0 ? ',' : '');\n objPrefix += JSON.stringify(key) + ':';\n queue.push({obj: value, prefix: objPrefix});\n }\n queue.push({val: '{'});\n }\n }\n return res;\n};\n\n// Convenience function for the parse function.\n// This pop function is basically copied from\n// pouchCollate.parseIndexableString\nfunction pop(obj, stack, metaStack) {\n var lastMetaElement = metaStack[metaStack.length - 1];\n if (obj === lastMetaElement.element) {\n // popping a meta-element, e.g. an object whose value is another object\n metaStack.pop();\n lastMetaElement = metaStack[metaStack.length - 1];\n }\n var element = lastMetaElement.element;\n var lastElementIndex = lastMetaElement.index;\n if (Array.isArray(element)) {\n element.push(obj);\n } else if (lastElementIndex === stack.length - 2) { // obj with key+value\n var key = stack.pop();\n element[key] = obj;\n } else {\n stack.push(obj); // obj with key only\n }\n}\n\nexports.parse = function (str) {\n var stack = [];\n var metaStack = []; // stack for arrays and objects\n var i = 0;\n var collationIndex,parsedNum,numChar;\n var parsedString,lastCh,numConsecutiveSlashes,ch;\n var arrayElement, objElement;\n while (true) {\n collationIndex = str[i++];\n if (collationIndex === '}' ||\n collationIndex === ']' ||\n typeof collationIndex === 'undefined') {\n if (stack.length === 1) {\n return stack.pop();\n } else {\n pop(stack.pop(), stack, metaStack);\n continue;\n }\n }\n switch (collationIndex) {\n case ' ':\n case '\\t':\n case '\\n':\n case ':':\n case ',':\n break;\n case 'n':\n i += 3; // 'ull'\n pop(null, stack, metaStack);\n break;\n case 't':\n i += 3; // 'rue'\n pop(true, stack, metaStack);\n break;\n case 'f':\n i += 4; // 'alse'\n pop(false, stack, metaStack);\n break;\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n case '-':\n parsedNum = '';\n i--;\n while (true) {\n numChar = str[i++];\n if (/[\\d\\.\\-e\\+]/.test(numChar)) {\n parsedNum += numChar;\n } else {\n i--;\n break;\n }\n }\n pop(parseFloat(parsedNum), stack, metaStack);\n break;\n case '\"':\n parsedString = '';\n lastCh = void 0;\n numConsecutiveSlashes = 0;\n while (true) {\n ch = str[i++];\n if (ch !== '\"' || (lastCh === '\\\\' &&\n numConsecutiveSlashes % 2 === 1)) {\n parsedString += ch;\n lastCh = ch;\n if (lastCh === '\\\\') {\n numConsecutiveSlashes++;\n } else {\n numConsecutiveSlashes = 0;\n }\n } else {\n break;\n }\n }\n pop(JSON.parse('\"' + parsedString + '\"'), stack, metaStack);\n break;\n case '[':\n arrayElement = { element: [], index: stack.length };\n stack.push(arrayElement.element);\n metaStack.push(arrayElement);\n break;\n case '{':\n objElement = { element: {}, index: stack.length };\n stack.push(objElement.element);\n metaStack.push(objElement);\n break;\n default:\n throw new Error(\n 'unexpectedly reached end of input: ' + collationIndex);\n }\n }\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n","import Md5 from 'spark-md5';\nimport { v4 } from 'uuid';\nimport vuvuzela from 'vuvuzela';\nimport EE from 'events';\n\nfunction isBinaryObject(object) {\n return (typeof ArrayBuffer !== 'undefined' && object instanceof ArrayBuffer) ||\n (typeof Blob !== 'undefined' && object instanceof Blob);\n}\n\n/**\n * @template {ArrayBuffer | Blob} T\n * @param {T} object\n * @returns {T}\n */\nfunction cloneBinaryObject(object) {\n return object instanceof ArrayBuffer\n ? object.slice(0)\n : object.slice(0, object.size, object.type);\n}\n\n// most of this is borrowed from lodash.isPlainObject:\n// https://github.com/fis-components/lodash.isplainobject/\n// blob/29c358140a74f252aeb08c9eb28bef86f2217d4a/index.js\n\nvar funcToString = Function.prototype.toString;\nvar objectCtorString = funcToString.call(Object);\n\nfunction isPlainObject(value) {\n var proto = Object.getPrototypeOf(value);\n /* istanbul ignore if */\n if (proto === null) { // not sure when this happens, but I guess it can\n return true;\n }\n var Ctor = proto.constructor;\n return (typeof Ctor == 'function' &&\n Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString);\n}\n\nfunction clone(object) {\n var newObject;\n var i;\n var len;\n\n if (!object || typeof object !== 'object') {\n return object;\n }\n\n if (Array.isArray(object)) {\n newObject = [];\n for (i = 0, len = object.length; i < len; i++) {\n newObject[i] = clone(object[i]);\n }\n return newObject;\n }\n\n // special case: to avoid inconsistencies between IndexedDB\n // and other backends, we automatically stringify Dates\n if (object instanceof Date && isFinite(object)) {\n return object.toISOString();\n }\n\n if (isBinaryObject(object)) {\n return cloneBinaryObject(object);\n }\n\n if (!isPlainObject(object)) {\n return object; // don't clone objects like Workers\n }\n\n newObject = {};\n for (i in object) {\n /* istanbul ignore else */\n if (Object.prototype.hasOwnProperty.call(object, i)) {\n var value = clone(object[i]);\n if (typeof value !== 'undefined') {\n newObject[i] = value;\n }\n }\n }\n return newObject;\n}\n\nfunction once(fun) {\n var called = false;\n return function (...args) {\n /* istanbul ignore if */\n if (called) {\n // this is a smoke test and should never actually happen\n throw new Error('once called more than once');\n } else {\n called = true;\n fun.apply(this, args);\n }\n };\n}\n\nfunction toPromise(func) {\n //create the function we will be returning\n return function (...args) {\n // Clone arguments\n args = clone(args);\n var self = this;\n // if the last argument is a function, assume its a callback\n var usedCB = (typeof args[args.length - 1] === 'function') ? args.pop() : false;\n var promise = new Promise(function (fulfill, reject) {\n var resp;\n try {\n var callback = once(function (err, mesg) {\n if (err) {\n reject(err);\n } else {\n fulfill(mesg);\n }\n });\n // create a callback for this invocation\n // apply the function in the orig context\n args.push(callback);\n resp = func.apply(self, args);\n if (resp && typeof resp.then === 'function') {\n fulfill(resp);\n }\n } catch (e) {\n reject(e);\n }\n });\n // if there is a callback, call it back\n if (usedCB) {\n promise.then(function (result) {\n usedCB(null, result);\n }, usedCB);\n }\n return promise;\n };\n}\n\nfunction logApiCall(self, name, args) {\n /* istanbul ignore if */\n if (self.constructor.listeners('debug').length) {\n var logArgs = ['api', self.name, name];\n for (var i = 0; i < args.length - 1; i++) {\n logArgs.push(args[i]);\n }\n self.constructor.emit('debug', logArgs);\n\n // override the callback itself to log the response\n var origCallback = args[args.length - 1];\n args[args.length - 1] = function (err, res) {\n var responseArgs = ['api', self.name, name];\n responseArgs = responseArgs.concat(\n err ? ['error', err] : ['success', res]\n );\n self.constructor.emit('debug', responseArgs);\n origCallback(err, res);\n };\n }\n}\n\nfunction adapterFun(name, callback) {\n return toPromise(function (...args) {\n if (this._closed) {\n return Promise.reject(new Error('database is closed'));\n }\n if (this._destroyed) {\n return Promise.reject(new Error('database is destroyed'));\n }\n var self = this;\n logApiCall(self, name, args);\n if (!this.taskqueue.isReady) {\n return new Promise(function (fulfill, reject) {\n self.taskqueue.addTask(function (failed) {\n if (failed) {\n reject(failed);\n } else {\n fulfill(self[name].apply(self, args));\n }\n });\n });\n }\n return callback.apply(this, args);\n });\n}\n\n// like underscore/lodash _.pick()\nfunction pick(obj, arr) {\n var res = {};\n for (var i = 0, len = arr.length; i < len; i++) {\n var prop = arr[i];\n if (prop in obj) {\n res[prop] = obj[prop];\n }\n }\n return res;\n}\n\n// Most browsers throttle concurrent requests at 6, so it's silly\n// to shim _bulk_get by trying to launch potentially hundreds of requests\n// and then letting the majority time out. We can handle this ourselves.\nvar MAX_NUM_CONCURRENT_REQUESTS = 6;\n\nfunction identityFunction(x) {\n return x;\n}\n\nfunction formatResultForOpenRevsGet(result) {\n return [{\n ok: result\n }];\n}\n\n// shim for P/CouchDB adapters that don't directly implement _bulk_get\nfunction bulkGet(db, opts, callback) {\n var requests = opts.docs;\n\n // consolidate into one request per doc if possible\n var requestsById = new Map();\n requests.forEach(function (request) {\n if (requestsById.has(request.id)) {\n requestsById.get(request.id).push(request);\n } else {\n requestsById.set(request.id, [request]);\n }\n });\n\n var numDocs = requestsById.size;\n var numDone = 0;\n var perDocResults = new Array(numDocs);\n\n function collapseResultsAndFinish() {\n var results = [];\n perDocResults.forEach(function (res) {\n res.docs.forEach(function (info) {\n results.push({\n id: res.id,\n docs: [info]\n });\n });\n });\n callback(null, {results});\n }\n\n function checkDone() {\n if (++numDone === numDocs) {\n collapseResultsAndFinish();\n }\n }\n\n function gotResult(docIndex, id, docs) {\n perDocResults[docIndex] = {id, docs};\n checkDone();\n }\n\n var allRequests = [];\n requestsById.forEach(function (value, key) {\n allRequests.push(key);\n });\n\n var i = 0;\n\n function nextBatch() {\n\n if (i >= allRequests.length) {\n return;\n }\n\n var upTo = Math.min(i + MAX_NUM_CONCURRENT_REQUESTS, allRequests.length);\n var batch = allRequests.slice(i, upTo);\n processBatch(batch, i);\n i += batch.length;\n }\n\n function processBatch(batch, offset) {\n batch.forEach(function (docId, j) {\n var docIdx = offset + j;\n var docRequests = requestsById.get(docId);\n\n // just use the first request as the \"template\"\n // TODO: The _bulk_get API allows for more subtle use cases than this,\n // but for now it is unlikely that there will be a mix of different\n // \"atts_since\" or \"attachments\" in the same request, since it's just\n // replicate.js that is using this for the moment.\n // Also, atts_since is aspirational, since we don't support it yet.\n var docOpts = pick(docRequests[0], ['atts_since', 'attachments']);\n docOpts.open_revs = docRequests.map(function (request) {\n // rev is optional, open_revs disallowed\n return request.rev;\n });\n\n // remove falsey / undefined revisions\n docOpts.open_revs = docOpts.open_revs.filter(identityFunction);\n\n var formatResult = identityFunction;\n\n if (docOpts.open_revs.length === 0) {\n delete docOpts.open_revs;\n\n // when fetching only the \"winning\" leaf,\n // transform the result so it looks like an open_revs\n // request\n formatResult = formatResultForOpenRevsGet;\n }\n\n // globally-supplied options\n ['revs', 'attachments', 'binary', 'ajax', 'latest'].forEach(function (param) {\n if (param in opts) {\n docOpts[param] = opts[param];\n }\n });\n db.get(docId, docOpts, function (err, res) {\n var result;\n /* istanbul ignore if */\n if (err) {\n result = [{error: err}];\n } else {\n result = formatResult(res);\n }\n gotResult(docIdx, docId, result);\n nextBatch();\n });\n });\n }\n\n nextBatch();\n\n}\n\nvar hasLocal;\n\ntry {\n localStorage.setItem('_pouch_check_localstorage', 1);\n hasLocal = !!localStorage.getItem('_pouch_check_localstorage');\n} catch (e) {\n hasLocal = false;\n}\n\nfunction hasLocalStorage() {\n return hasLocal;\n}\n\nconst nextTick = typeof queueMicrotask === \"function\"\n ? queueMicrotask\n : function nextTick(fn) {\n Promise.resolve().then(fn);\n };\n\nclass Changes extends EE {\n constructor() {\n super();\n\n this._listeners = {};\n\n if (hasLocalStorage()) {\n addEventListener(\"storage\", (e) => {\n this.emit(e.key);\n });\n }\n }\n\n addListener(dbName, id, db, opts) {\n if (this._listeners[id]) {\n return;\n }\n var inprogress = false;\n var self = this;\n function eventFunction() {\n if (!self._listeners[id]) {\n return;\n }\n if (inprogress) {\n inprogress = 'waiting';\n return;\n }\n inprogress = true;\n var changesOpts = pick(opts, [\n 'style', 'include_docs', 'attachments', 'conflicts', 'filter',\n 'doc_ids', 'view', 'since', 'query_params', 'binary', 'return_docs'\n ]);\n\n function onError() {\n inprogress = false;\n }\n\n db.changes(changesOpts).on('change', function (c) {\n if (c.seq > opts.since && !opts.cancelled) {\n opts.since = c.seq;\n opts.onChange(c);\n }\n }).on('complete', function () {\n if (inprogress === 'waiting') {\n nextTick(eventFunction);\n }\n inprogress = false;\n }).on('error', onError);\n }\n this._listeners[id] = eventFunction;\n this.on(dbName, eventFunction);\n }\n\n removeListener(dbName, id) {\n if (!(id in this._listeners)) {\n return;\n }\n super.removeListener(dbName, this._listeners[id]);\n delete this._listeners[id];\n }\n\n notifyLocalWindows(dbName) {\n //do a useless change on a storage thing\n //in order to get other windows's listeners to activate\n if (hasLocalStorage()) {\n localStorage[dbName] = (localStorage[dbName] === \"a\") ? \"b\" : \"a\";\n }\n }\n\n notify(dbName) {\n this.emit(dbName);\n this.notifyLocalWindows(dbName);\n }\n}\n\nfunction guardedConsole(method) {\n /* istanbul ignore else */\n if (typeof console !== 'undefined' && typeof console[method] === 'function') {\n var args = Array.prototype.slice.call(arguments, 1);\n console[method].apply(console, args);\n }\n}\n\nfunction randomNumber(min, max) {\n var maxTimeout = 600000; // Hard-coded default of 10 minutes\n min = parseInt(min, 10) || 0;\n max = parseInt(max, 10);\n if (max !== max || max <= min) {\n max = (min || 1) << 1; //doubling\n } else {\n max = max + 1;\n }\n // In order to not exceed maxTimeout, pick a random value between half of maxTimeout and maxTimeout\n if (max > maxTimeout) {\n min = maxTimeout >> 1; // divide by two\n max = maxTimeout;\n }\n var ratio = Math.random();\n var range = max - min;\n\n return ~~(range * ratio + min); // ~~ coerces to an int, but fast.\n}\n\nfunction defaultBackOff(min) {\n var max = 0;\n if (!min) {\n max = 2000;\n }\n return randomNumber(min, max);\n}\n\n// designed to give info to browser users, who are disturbed\n// when they see http errors in the console\nfunction explainError(status, str) {\n guardedConsole('info', 'The above ' + status + ' is totally normal. ' + str);\n}\n\nclass PouchError extends Error {\n constructor(status, error, reason) {\n super();\n this.status = status;\n this.name = error;\n this.message = reason;\n this.error = true;\n }\n\n toString() {\n return JSON.stringify({\n status: this.status,\n name: this.name,\n message: this.message,\n reason: this.reason\n });\n }\n}\n\nvar UNAUTHORIZED = new PouchError(401, 'unauthorized', \"Name or password is incorrect.\");\nvar MISSING_BULK_DOCS = new PouchError(400, 'bad_request', \"Missing JSON list of 'docs'\");\nvar MISSING_DOC = new PouchError(404, 'not_found', 'missing');\nvar REV_CONFLICT = new PouchError(409, 'conflict', 'Document update conflict');\nvar INVALID_ID = new PouchError(400, 'bad_request', '_id field must contain a string');\nvar MISSING_ID = new PouchError(412, 'missing_id', '_id is required for puts');\nvar RESERVED_ID = new PouchError(400, 'bad_request', 'Only reserved document ids may start with underscore.');\nvar NOT_OPEN = new PouchError(412, 'precondition_failed', 'Database not open');\nvar UNKNOWN_ERROR = new PouchError(500, 'unknown_error', 'Database encountered an unknown error');\nvar BAD_ARG = new PouchError(500, 'badarg', 'Some query argument is invalid');\nvar INVALID_REQUEST = new PouchError(400, 'invalid_request', 'Request was invalid');\nvar QUERY_PARSE_ERROR = new PouchError(400, 'query_parse_error', 'Some query parameter is invalid');\nvar DOC_VALIDATION = new PouchError(500, 'doc_validation', 'Bad special document member');\nvar BAD_REQUEST = new PouchError(400, 'bad_request', 'Something wrong with the request');\nvar NOT_AN_OBJECT = new PouchError(400, 'bad_request', 'Document must be a JSON object');\nvar DB_MISSING = new PouchError(404, 'not_found', 'Database not found');\nvar IDB_ERROR = new PouchError(500, 'indexed_db_went_bad', 'unknown');\nvar WSQ_ERROR = new PouchError(500, 'web_sql_went_bad', 'unknown');\nvar LDB_ERROR = new PouchError(500, 'levelDB_went_went_bad', 'unknown');\nvar FORBIDDEN = new PouchError(403, 'forbidden', 'Forbidden by design doc validate_doc_update function');\nvar INVALID_REV = new PouchError(400, 'bad_request', 'Invalid rev format');\nvar FILE_EXISTS = new PouchError(412, 'file_exists', 'The database could not be created, the file already exists.');\nvar MISSING_STUB = new PouchError(412, 'missing_stub', 'A pre-existing attachment stub wasn\\'t found');\nvar INVALID_URL = new PouchError(413, 'invalid_url', 'Provided URL is invalid');\n\nfunction createError(error, reason) {\n function CustomPouchError(reason) {\n // inherit error properties from our parent error manually\n // so as to allow proper JSON parsing.\n var names = Object.getOwnPropertyNames(error);\n for (var i = 0, len = names.length; i < len; i++) {\n if (typeof error[names[i]] !== 'function') {\n this[names[i]] = error[names[i]];\n }\n }\n\n if (this.stack === undefined) {\n this.stack = (new Error()).stack;\n }\n\n if (reason !== undefined) {\n this.reason = reason;\n }\n }\n CustomPouchError.prototype = PouchError.prototype;\n return new CustomPouchError(reason);\n}\n\nfunction generateErrorFromResponse(err) {\n\n if (typeof err !== 'object') {\n var data = err;\n err = UNKNOWN_ERROR;\n err.data = data;\n }\n\n if ('error' in err && err.error === 'conflict') {\n err.name = 'conflict';\n err.status = 409;\n }\n\n if (!('name' in err)) {\n err.name = err.error || 'unknown';\n }\n\n if (!('status' in err)) {\n err.status = 500;\n }\n\n if (!('message' in err)) {\n err.message = err.message || err.reason;\n }\n\n if (!('stack' in err)) {\n err.stack = (new Error()).stack;\n }\n\n return err;\n}\n\nfunction tryFilter(filter, doc, req) {\n try {\n return !filter(doc, req);\n } catch (err) {\n var msg = 'Filter function threw: ' + err.toString();\n return createError(BAD_REQUEST, msg);\n }\n}\n\nfunction filterChange(opts) {\n var req = {};\n var hasFilter = opts.filter && typeof opts.filter === 'function';\n req.query = opts.query_params;\n\n return function filter(change) {\n if (!change.doc) {\n // CSG sends events on the changes feed that don't have documents,\n // this hack makes a whole lot of existing code robust.\n change.doc = {};\n }\n\n var filterReturn = hasFilter && tryFilter(opts.filter, change.doc, req);\n\n if (typeof filterReturn === 'object') {\n return filterReturn;\n }\n\n if (filterReturn) {\n return false;\n }\n\n if (!opts.include_docs) {\n delete change.doc;\n } else if (!opts.attachments) {\n for (var att in change.doc._attachments) {\n /* istanbul ignore else */\n if (Object.prototype.hasOwnProperty.call(change.doc._attachments, att)) {\n change.doc._attachments[att].stub = true;\n }\n }\n }\n return true;\n };\n}\n\n// shim for Function.prototype.name,\n\n// Determine id an ID is valid\n// - invalid IDs begin with an underescore that does not begin '_design' or\n// '_local'\n// - any other string value is a valid id\n// Returns the specific error object for each case\nfunction invalidIdError(id) {\n var err;\n if (!id) {\n err = createError(MISSING_ID);\n } else if (typeof id !== 'string') {\n err = createError(INVALID_ID);\n } else if (/^_/.test(id) && !(/^_(design|local)/).test(id)) {\n err = createError(RESERVED_ID);\n }\n if (err) {\n throw err;\n }\n}\n\n// Checks if a PouchDB object is \"remote\" or not. This is\n\nfunction isRemote(db) {\n if (typeof db._remote === 'boolean') {\n return db._remote;\n }\n /* istanbul ignore next */\n if (typeof db.type === 'function') {\n guardedConsole('warn',\n 'db.type() is deprecated and will be removed in ' +\n 'a future version of PouchDB');\n return db.type() === 'http';\n }\n /* istanbul ignore next */\n return false;\n}\n\nfunction listenerCount(ee, type) {\n return 'listenerCount' in ee ? ee.listenerCount(type) :\n EE.listenerCount(ee, type);\n}\n\nfunction parseDesignDocFunctionName(s) {\n if (!s) {\n return null;\n }\n var parts = s.split('/');\n if (parts.length === 2) {\n return parts;\n }\n if (parts.length === 1) {\n return [s, s];\n }\n return null;\n}\n\nfunction normalizeDesignDocFunctionName(s) {\n var normalized = parseDesignDocFunctionName(s);\n return normalized ? normalized.join('/') : null;\n}\n\n// originally parseUri 1.2.2, now patched by us\n// (c) Steven Levithan <stevenlevithan.com>\n// MIT License\nvar keys = [\"source\", \"protocol\", \"authority\", \"userInfo\", \"user\", \"password\",\n \"host\", \"port\", \"relative\", \"path\", \"directory\", \"file\", \"query\", \"anchor\"];\nvar qName =\"queryKey\";\nvar qParser = /(?:^|&)([^&=]*)=?([^&]*)/g;\n\n// use the \"loose\" parser\n/* eslint no-useless-escape: 0 */\nvar parser = /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\n\nfunction parseUri(str) {\n var m = parser.exec(str);\n var uri = {};\n var i = 14;\n\n while (i--) {\n var key = keys[i];\n var value = m[i] || \"\";\n var encoded = ['user', 'password'].indexOf(key) !== -1;\n uri[key] = encoded ? decodeURIComponent(value) : value;\n }\n\n uri[qName] = {};\n uri[keys[12]].replace(qParser, function ($0, $1, $2) {\n if ($1) {\n uri[qName][$1] = $2;\n }\n });\n\n return uri;\n}\n\n// Based on https://github.com/alexdavid/scope-eval v0.0.3\n// (source: https://unpkg.com/scope-eval@0.0.3/scope_eval.js)\n// This is basically just a wrapper around new Function()\n\nfunction scopeEval(source, scope) {\n var keys = [];\n var values = [];\n for (var key in scope) {\n if (Object.prototype.hasOwnProperty.call(scope, key)) {\n keys.push(key);\n values.push(scope[key]);\n }\n }\n keys.push(source);\n return Function.apply(null, keys).apply(null, values);\n}\n\n// this is essentially the \"update sugar\" function from daleharvey/pouchdb#1388\n// the diffFun tells us what delta to apply to the doc. it either returns\n// the doc, or false if it doesn't need to do an update after all\nfunction upsert(db, docId, diffFun) {\n return db.get(docId)\n .catch(function (err) {\n /* istanbul ignore next */\n if (err.status !== 404) {\n throw err;\n }\n return {};\n })\n .then(function (doc) {\n // the user might change the _rev, so save it for posterity\n var docRev = doc._rev;\n var newDoc = diffFun(doc);\n\n if (!newDoc) {\n // if the diffFun returns falsy, we short-circuit as\n // an optimization\n return {updated: false, rev: docRev};\n }\n\n // users aren't allowed to modify these values,\n // so reset them here\n newDoc._id = docId;\n newDoc._rev = docRev;\n return tryAndPut(db, newDoc, diffFun);\n });\n}\n\nfunction tryAndPut(db, doc, diffFun) {\n return db.put(doc).then(function (res) {\n return {\n updated: true,\n rev: res.rev\n };\n }, function (err) {\n /* istanbul ignore next */\n if (err.status !== 409) {\n throw err;\n }\n return upsert(db, doc._id, diffFun);\n });\n}\n\nvar thisAtob = function (str) {\n return atob(str);\n};\n\nvar thisBtoa = function (str) {\n return btoa(str);\n};\n\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor (e.g.\n// old QtWebKit versions, Android < 4.4).\nfunction createBlob(parts, properties) {\n /* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */\n parts = parts || [];\n properties = properties || {};\n try {\n return new Blob(parts, properties);\n } catch (e) {\n if (e.name !== \"TypeError\") {\n throw e;\n }\n var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder :\n typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder :\n typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder :\n WebKitBlobBuilder;\n var builder = new Builder();\n for (var i = 0; i < parts.length; i += 1) {\n builder.append(parts[i]);\n }\n return builder.getBlob(properties.type);\n }\n}\n\n// From http://stackoverflow.com/questions/14967647/ (continues on next line)\n// encode-decode-image-with-base64-breaks-image (2013-04-21)\nfunction binaryStringToArrayBuffer(bin) {\n var length = bin.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n for (var i = 0; i < length; i++) {\n arr[i] = bin.charCodeAt(i);\n }\n return buf;\n}\n\nfunction binStringToBluffer(binString, type) {\n return createBlob([binaryStringToArrayBuffer(binString)], {type});\n}\n\nfunction b64ToBluffer(b64, type) {\n return binStringToBluffer(thisAtob(b64), type);\n}\n\n//Can't find original post, but this is close\n//http://stackoverflow.com/questions/6965107/ (continues on next line)\n//converting-between-strings-and-arraybuffers\nfunction arrayBufferToBinaryString(buffer) {\n var binary = '';\n var bytes = new Uint8Array(buffer);\n var length = bytes.byteLength;\n for (var i = 0; i < length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return binary;\n}\n\n// shim for browsers that don't support it\nfunction readAsBinaryString(blob, callback) {\n var reader = new FileReader();\n var hasBinaryString = typeof reader.readAsBinaryString === 'function';\n reader.onloadend = function (e) {\n var result = e.target.result || '';\n if (hasBinaryString) {\n return callback(result);\n }\n callback(arrayBufferToBinaryString(result));\n };\n if (hasBinaryString) {\n reader.readAsBinaryString(blob);\n } else {\n reader.readAsArrayBuffer(blob);\n }\n}\n\nfunction blobToBinaryString(blobOrBuffer, callback) {\n readAsBinaryString(blobOrBuffer, function (bin) {\n callback(bin);\n });\n}\n\nfunction blobToBase64(blobOrBuffer, callback) {\n blobToBinaryString(blobOrBuffer, function (base64) {\n callback(thisBtoa(base64));\n });\n}\n\n// simplified API. universal browser support is assumed\nfunction readAsArrayBuffer(blob, callback) {\n var reader = new FileReader();\n reader.onloadend = function (e) {\n var result = e.target.result || new ArrayBuffer(0);\n callback(result);\n };\n reader.readAsArrayBuffer(blob);\n}\n\n// this is not used in the browser\n\nvar setImmediateShim = self.setImmediate || self.setTimeout;\nvar MD5_CHUNK_SIZE = 32768;\n\nfunction rawToBase64(raw) {\n return thisBtoa(raw);\n}\n\nfunction appendBlob(buffer, blob, start, end, callback) {\n if (start > 0 || end < blob.size) {\n // only slice blob if we really need to\n blob = blob.slice(start, end);\n }\n readAsArrayBuffer(blob, function (arrayBuffer) {\n buffer.append(arrayBuffer);\n callback();\n });\n}\n\nfunction appendString(buffer, string, start, end, callback) {\n if (start > 0 || end < string.length) {\n // only create a substring if we really need to\n string = string.substring(start, end);\n }\n buffer.appendBinary(string);\n callback();\n}\n\nfunction binaryMd5(data, callback) {\n var inputIsString = typeof data === 'string';\n var len = inputIsString ? data.length : data.size;\n var chunkSize = Math.min(MD5_CHUNK_SIZE, len);\n var chunks = Math.ceil(len / chunkSize);\n var currentChunk = 0;\n var buffer = inputIsString ? new Md5() : new Md5.ArrayBuffer();\n\n var append = inputIsString ? appendString : appendBlob;\n\n function next() {\n setImmediateShim(loadNextChunk);\n }\n\n function done() {\n var raw = buffer.end(true);\n var base64 = rawToBase64(raw);\n callback(base64);\n buffer.destroy();\n }\n\n function loadNextChunk() {\n var start = currentChunk * chunkSize;\n var end = start + chunkSize;\n currentChunk++;\n if (currentChunk < chunks) {\n append(buffer, data, start, end, next);\n } else {\n append(buffer, data, start, end, done);\n }\n }\n loadNextChunk();\n}\n\nfunction stringMd5(string) {\n return Md5.hash(string);\n}\n\n/**\n * Creates a new revision string that does NOT include the revision height\n * For example '56649f1b0506c6ca9fda0746eb0cacdf'\n */\nfunction rev(doc, deterministic_revs) {\n if (!deterministic_revs) {\n return v4().replace(/-/g, '').toLowerCase();\n }\n\n var mutateableDoc = Object.assign({}, doc);\n delete mutateableDoc._rev_tree;\n return stringMd5(JSON.stringify(mutateableDoc));\n}\n\nvar uuid = v4; // mimic old import, only v4 is ever used elsewhere\n\n// We fetch all leafs of the revision tree, and sort them based on tree length\n// and whether they were deleted, undeleted documents with the longest revision\n// tree (most edits) win\n// The final sort algorithm is slightly documented in a sidebar here:\n// http://guide.couchdb.org/draft/conflicts.html\nfunction winningRev(metadata) {\n var winningId;\n var winningPos;\n var winningDeleted;\n var toVisit = metadata.rev_tree.slice();\n var node;\n while ((node = toVisit.pop())) {\n var tree = node.ids;\n var branches = tree[2];\n var pos = node.pos;\n if (branches.length) { // non-leaf\n for (var i = 0, len = branches.length; i < len; i++) {\n toVisit.push({pos: pos + 1, ids: branches[i]});\n }\n continue;\n }\n var deleted = !!tree[1].deleted;\n var id = tree[0];\n // sort by deleted, then pos, then id\n if (!winningId || (winningDeleted !== deleted ? winningDeleted :\n winningPos !== pos ? winningPos < pos : winningId < id)) {\n winningId = id;\n winningPos = pos;\n winningDeleted = deleted;\n }\n }\n\n return winningPos + '-' + winningId;\n}\n\n// Pretty much all below can be combined into a higher order function to\n// traverse revisions\n// The return value from the callback will be passed as context to all\n// children of that node\nfunction traverseRevTree(revs, callback) {\n var toVisit = revs.slice();\n\n var node;\n while ((node = toVisit.pop())) {\n var pos = node.pos;\n var tree = node.ids;\n var branches = tree[2];\n var newCtx =\n callback(branches.length === 0, pos, tree[0], node.ctx, tree[1]);\n for (var i = 0, len = branches.length; i < len; i++) {\n toVisit.push({pos: pos + 1, ids: branches[i], ctx: newCtx});\n }\n }\n}\n\nfunction sortByPos(a, b) {\n return a.pos - b.pos;\n}\n\nfunction collectLeaves(revs) {\n var leaves = [];\n traverseRevTree(revs, function (isLeaf, pos, id, acc, opts) {\n if (isLeaf) {\n leaves.push({rev: pos + \"-\" + id, pos, opts});\n }\n });\n leaves.sort(sortByPos).reverse();\n for (var i = 0, len = leaves.length; i < len; i++) {\n delete leaves[i].pos;\n }\n return leaves;\n}\n\n// returns revs of all conflicts that is leaves such that\n// 1. are not deleted and\n// 2. are different than winning revision\nfunction collectConflicts(metadata) {\n var win = winningRev(metadata);\n var leaves = collectLeaves(metadata.rev_tree);\n var conflicts = [];\n for (var i = 0, len = leaves.length; i < len; i++) {\n var leaf = leaves[i];\n if (leaf.rev !== win && !leaf.opts.deleted) {\n conflicts.push(leaf.rev);\n }\n }\n return conflicts;\n}\n\n// compact a tree by marking its non-leafs as missing,\n// and return a list of revs to delete\nfunction compactTree(metadata) {\n var revs = [];\n traverseRevTree(metadata.rev_tree, function (isLeaf, pos,\n revHash, ctx, opts) {\n if (opts.status === 'available' && !isLeaf) {\n revs.push(pos + '-' + revHash);\n opts.status = 'missing';\n }\n });\n return revs;\n}\n\n// `findPathToLeaf()` returns an array of revs that goes from the specified\n// leaf rev to the root of that leaf’s branch.\n//\n// eg. for this rev tree:\n// 1-9692 ▶ 2-37aa ▶ 3-df22 ▶ 4-6e94 ▶ 5-df4a ▶ 6-6a3a ▶ 7-57e5\n// ┃ ┗━━━━━━▶ 5-8d8c ▶ 6-65e0\n// ┗━━━━━━▶ 3-43f6 ▶ 4-a3b4\n//\n// For a `targetRev` of '7-57e5', `findPathToLeaf()` would return ['7-57e5', '6-6a3a', '5-df4a']\n// The `revs` argument has the same structure as what `revs_tree` has on e.g.\n// the IndexedDB representation of the rev tree datastructure. Please refer to\n// tests/unit/test.purge.js for examples of what these look like.\n//\n// This function will throw an error if:\n// - The requested revision does not exist\n// - The requested revision is not a leaf\nfunction findPathToLeaf(revs, targetRev) {\n let path = [];\n const toVisit = revs.slice();\n\n let node;\n while ((node = toVisit.pop())) {\n const { pos, ids: tree } = node;\n const rev = `${pos}-${tree[0]}`;\n const branches = tree[2];\n\n // just assuming we're already working on the path up towards our desired leaf.\n path.push(rev);\n\n // we've reached the leaf of our dreams, so return the computed path.\n if (rev === targetRev) {\n //…unleeeeess\n if (branches.length !== 0) {\n throw new Error('The requested revision is not a leaf');\n }\n return path.reverse();\n }\n\n // this is based on the assumption that after we have a leaf (`branches.length == 0`), we handle the next\n // branch. this is true for all branches other than the path leading to the winning rev (which is 7-57e5 in\n // the example above. i've added a reset condition for branching nodes (`branches.length > 1`) as well.\n if (branches.length === 0 || branches.length > 1) {\n path = [];\n }\n\n // as a next step, we push the branches of this node to `toVisit` for visiting it during the next iteration\n for (let i = 0, len = branches.length; i < len; i++) {\n toVisit.push({ pos: pos + 1, ids: branches[i] });\n }\n }\n if (path.length === 0) {\n throw new Error('The requested revision does not exist');\n }\n return path.reverse();\n}\n\n// build up a list of all the paths to the leafs in this revision tree\nfunction rootToLeaf(revs) {\n var paths = [];\n var toVisit = revs.slice();\n var node;\n while ((node = toVisit.pop())) {\n var pos = node.pos;\n var tree = node.ids;\n var id = tree[0];\n var opts = tree[1];\n var branches = tree[2];\n var isLeaf = branches.length === 0;\n\n var history = node.history ? node.history.slice() : [];\n history.push({id, opts});\n if (isLeaf) {\n paths.push({pos: (pos + 1 - history.length), ids: history});\n }\n for (var i = 0, len = branches.length; i < len; i++) {\n toVisit.push({pos: pos + 1, ids: branches[i], history});\n }\n }\n return paths.reverse();\n}\n\n// for a better overview of what this is doing, read:\n\nfunction sortByPos$1(a, b) {\n return a.pos - b.pos;\n}\n\n// classic binary search\nfunction binarySearch(arr, item, comparator) {\n var low = 0;\n var high = arr.length;\n var mid;\n while (low < high) {\n mid = (low + high) >>> 1;\n if (comparator(arr[mid], item) < 0) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return low;\n}\n\n// assuming the arr is sorted, insert the item in the proper place\nfunction insertSorted(arr, item, comparator) {\n var idx = binarySearch(arr, item, comparator);\n arr.splice(idx, 0, item);\n}\n\n// Turn a path as a flat array into a tree with a single branch.\n// If any should be stemmed from the beginning of the array, that's passed\n// in as the second argument\nfunction pathToTree(path, numStemmed) {\n var root;\n var leaf;\n for (var i = numStemmed, len = path.length; i < len; i++) {\n var node = path[i];\n var currentLeaf = [node.id, node.opts, []];\n if (leaf) {\n leaf[2].push(currentLeaf);\n leaf = currentLeaf;\n } else {\n root = leaf = currentLeaf;\n }\n }\n return root;\n}\n\n// compare the IDs of two trees\nfunction compareTree(a, b) {\n return a[0] < b[0] ? -1 : 1;\n}\n\n// Merge two trees together\n// The roots of tree1 and tree2 must be the same revision\nfunction mergeTree(in_tree1, in_tree2) {\n var queue = [{tree1: in_tree1, tree2: in_tree2}];\n var conflicts = false;\n while (queue.length > 0) {\n var item = queue.pop();\n var tree1 = item.tree1;\n var tree2 = item.tree2;\n\n if (tree1[1].status || tree2[1].status) {\n tree1[1].status =\n (tree1[1].status === 'available' ||\n tree2[1].status === 'available') ? 'available' : 'missing';\n }\n\n for (var i = 0; i < tree2[2].length; i++) {\n if (!tree1[2][0]) {\n conflicts = 'new_leaf';\n tree1[2][0] = tree2[2][i];\n continue;\n }\n\n var merged = false;\n for (var j = 0; j < tree1[2].length; j++) {\n if (tree1[2][j][0] === tree2[2][i][0]) {\n queue.push({tree1: tree1[2][j], tree2: tree2[2][i]});\n merged = true;\n }\n }\n if (!merged) {\n conflicts = 'new_branch';\n insertSorted(tree1[2], tree2[2][i], compareTree);\n }\n }\n }\n return {conflicts, tree: in_tree1};\n}\n\nfunction doMerge(tree, path, dontExpand) {\n var restree = [];\n var conflicts = false;\n var merged = false;\n var res;\n\n if (!tree.length) {\n return {tree: [path], conflicts: 'new_leaf'};\n }\n\n for (var i = 0, len = tree.length; i < len; i++) {\n var branch = tree[i];\n if (branch.pos === path.pos && branch.ids[0] === path.ids[0]) {\n // Paths start at the same position and have the same root, so they need\n // merged\n res = mergeTree(branch.ids, path.ids);\n restree.push({pos: branch.pos, ids: res.tree});\n conflicts = conflicts || res.conflicts;\n merged = true;\n } else if (dontExpand !== true) {\n // The paths start at a different position, take the earliest path and\n // traverse up until it as at the same point from root as the path we\n // want to merge. If the keys match we return the longer path with the\n // other merged After stemming we don't want to expand the trees\n\n var t1 = branch.pos < path.pos ? branch : path;\n var t2 = branch.pos < path.pos ? path : branch;\n var diff = t2.pos - t1.pos;\n\n var candidateParents = [];\n\n var trees = [];\n trees.push({ids: t1.ids, diff, parent: null, parentIdx: null});\n while (trees.length > 0) {\n var item = trees.pop();\n if (item.diff === 0) {\n if (item.ids[0] === t2.ids[0]) {\n candidateParents.push(item);\n }\n continue;\n }\n var elements = item.ids[2];\n for (var j = 0, elementsLen = elements.length; j < elementsLen; j++) {\n trees.push({\n ids: elements[j],\n diff: item.diff - 1,\n parent: item.ids,\n parentIdx: j\n });\n }\n }\n\n var el = candidateParents[0];\n\n if (!el) {\n restree.push(branch);\n } else {\n res = mergeTree(el.ids, t2.ids);\n el.parent[2][el.parentIdx] = res.tree;\n restree.push({pos: t1.pos, ids: t1.ids});\n conflicts = conflicts || res.conflicts;\n merged = true;\n }\n } else {\n restree.push(branch);\n }\n }\n\n // We didnt find\n if (!merged) {\n restree.push(path);\n }\n\n restree.sort(sortByPos$1);\n\n return {\n tree: restree,\n conflicts: conflicts || 'internal_node'\n };\n}\n\n// To ensure we don't grow the revision tree infinitely, we stem old revisions\nfunction stem(tree, depth) {\n // First we break out the tree into a complete list of root to leaf paths\n var paths = rootToLeaf(tree);\n var stemmedRevs;\n\n var result;\n for (var i = 0, len = paths.length; i < len; i++) {\n // Then for each path, we cut off the start of the path based on the\n // `depth` to stem to, and generate a new set of flat trees\n var path = paths[i];\n var stemmed = path.ids;\n var node;\n if (stemmed.length > depth) {\n // only do the stemming work if we actually need to stem\n if (!stemmedRevs) {\n stemmedRevs = {}; // avoid allocating this object unnecessarily\n }\n var numStemmed = stemmed.length - depth;\n node = {\n pos: path.pos + numStemmed,\n ids: pathToTree(stemmed, numStemmed)\n };\n\n for (var s = 0; s < numStemmed; s++) {\n var rev = (path.pos + s) + '-' + stemmed[s].id;\n stemmedRevs[rev] = true;\n }\n } else { // no need to actually stem\n node = {\n pos: path.pos,\n ids: pathToTree(stemmed, 0)\n };\n }\n\n // Then we remerge all those flat trees together, ensuring that we don't\n // connect trees that would go beyond the depth limit\n if (result) {\n result = doMerge(result, node, true).tree;\n } else {\n result = [node];\n }\n }\n\n // this is memory-heavy per Chrome profiler, avoid unless we actually stemmed\n if (stemmedRevs) {\n traverseRevTree(result, function (isLeaf, pos, revHash) {\n // some revisions may have been removed in a branch but not in another\n delete stemmedRevs[pos + '-' + revHash];\n });\n }\n\n return {\n tree: result,\n revs: stemmedRevs ? Object.keys(stemmedRevs) : []\n };\n}\n\nfunction merge(tree, path, depth) {\n var newTree = doMerge(tree, path);\n var stemmed = stem(newTree.tree, depth);\n return {\n tree: stemmed.tree,\n stemmedRevs: stemmed.revs,\n conflicts: newTree.conflicts\n };\n}\n\n// return true if a rev exists in the rev tree, false otherwise\nfunction revExists(revs, rev) {\n var toVisit = revs.slice();\n var splitRev = rev.split('-');\n var targetPos = parseInt(splitRev[0], 10);\n var targetId = splitRev[1];\n\n var node;\n while ((node = toVisit.pop())) {\n if (node.pos === targetPos && node.ids[0] === targetId) {\n return true;\n }\n var branches = node.ids[2];\n for (var i = 0, len = branches.length; i < len; i++) {\n toVisit.push({pos: node.pos + 1, ids: branches[i]});\n }\n }\n return false;\n}\n\nfunction getTrees(node) {\n return node.ids;\n}\n\n// check if a specific revision of a doc has been deleted\n// - metadata: the metadata object from the doc store\n// - rev: (optional) the revision to check. defaults to winning revision\nfunction isDeleted(metadata, rev) {\n if (!rev) {\n rev = winningRev(metadata);\n }\n var id = rev.substring(rev.indexOf('-') + 1);\n var toVisit = metadata.rev_tree.map(getTrees);\n\n var tree;\n while ((tree = toVisit.pop())) {\n if (tree[0] === id) {\n return !!tree[1].deleted;\n }\n toVisit = toVisit.concat(tree[2]);\n }\n}\n\nfunction isLocalId(id) {\n return typeof id === 'string' && id.startsWith('_local/');\n}\n\n// returns the current leaf node for a given revision\nfunction latest(rev, metadata) {\n var toVisit = metadata.rev_tree.slice();\n var node;\n while ((node = toVisit.pop())) {\n var pos = node.pos;\n var tree = node.ids;\n var id = tree[0];\n var opts = tree[1];\n var branches = tree[2];\n var isLeaf = branches.length === 0;\n\n var history = node.history ? node.history.slice() : [];\n history.push({id, pos, opts});\n\n if (isLeaf) {\n for (var i = 0, len = history.length; i < len; i++) {\n var historyNode = history[i];\n var historyRev = historyNode.pos + '-' + historyNode.id;\n\n if (historyRev === rev) {\n // return the rev of this leaf\n return pos + '-' + id;\n }\n }\n }\n\n for (var j = 0, l = branches.length; j < l; j++) {\n toVisit.push({pos: pos + 1, ids: branches[j], history});\n }\n }\n\n /* istanbul ignore next */\n throw new Error('Unable to resolve latest revision for id ' + metadata.id + ', rev ' + rev);\n}\n\nfunction tryCatchInChangeListener(self, change, pending, lastSeq) {\n // isolate try/catches to avoid V8 deoptimizations\n try {\n self.emit('change', change, pending, lastSeq);\n } catch (e) {\n guardedConsole('error', 'Error in .on(\"change\", function):', e);\n }\n}\n\nfunction processChange(doc, metadata, opts) {\n var changeList = [{rev: doc._rev}];\n if (opts.style === 'all_docs') {\n changeList = collectLeaves(metadata.rev_tree)\n .map(function (x) { return {rev: x.rev}; });\n }\n var change = {\n id: metadata.id,\n changes: changeList,\n doc\n };\n\n if (isDeleted(metadata, doc._rev)) {\n change.deleted = true;\n }\n if (opts.conflicts) {\n change.doc._conflicts = collectConflicts(metadata);\n if (!change.doc._conflicts.length) {\n delete change.doc._conflicts;\n }\n }\n return change;\n}\n\nclass Changes$1 extends EE {\n constructor(db, opts, callback) {\n super();\n this.db = db;\n opts = opts ? clone(opts) : {};\n var complete = opts.complete = once((err, resp) => {\n if (err) {\n if (listenerCount(this, 'error') > 0) {\n this.emit('error', err);\n }\n } else {\n this.emit('complete', resp);\n }\n this.removeAllListeners();\n db.removeListener('destroyed', onDestroy);\n });\n if (callback) {\n this.on('complete', function (resp) {\n callback(null, resp);\n });\n this.on('error', callback);\n }\n const onDestroy = () => {\n this.cancel();\n };\n db.once('destroyed', onDestroy);\n\n opts.onChange = (change, pending, lastSeq) => {\n /* istanbul ignore if */\n if (this.isCancelled) {\n return;\n }\n tryCatchInChangeListener(this, change, pending, lastSeq);\n };\n\n var promise = new Promise(function (fulfill, reject) {\n opts.complete = function (err, res) {\n if (err) {\n reject(err);\n } else {\n fulfill(res);\n }\n };\n });\n this.once('cancel', function () {\n db.removeListener('destroyed', onDestroy);\n opts.complete(null, {status: 'cancelled'});\n });\n this.then = promise.then.bind(promise);\n this['catch'] = promise['catch'].bind(promise);\n this.then(function (result) {\n complete(null, result);\n }, complete);\n\n\n\n if (!db.taskqueue.isReady) {\n db.taskqueue.addTask((failed) => {\n if (failed) {\n opts.complete(failed);\n } else if (this.isCancelled) {\n this.emit('cancel');\n } else {\n this.validateChanges(opts);\n }\n });\n } else {\n this.validateChanges(opts);\n }\n }\n\n cancel() {\n this.isCancelled = true;\n if (this.db.taskqueue.isReady) {\n this.emit('cancel');\n }\n }\n\n validateChanges(opts) {\n var callback = opts.complete;\n\n /* istanbul ignore else */\n if (PouchDB._changesFilterPlugin) {\n PouchDB._changesFilterPlugin.validate(opts, (err) => {\n if (err) {\n return callback(err);\n }\n this.doChanges(opts);\n });\n } else {\n this.doChanges(opts);\n }\n }\n\n doChanges(opts) {\n var callback = opts.complete;\n\n opts = clone(opts);\n if ('live' in opts && !('continuous' in opts)) {\n opts.continuous = opts.live;\n }\n opts.processChange = processChange;\n\n if (opts.since === 'latest') {\n opts.since = 'now';\n }\n if (!opts.since) {\n opts.since = 0;\n }\n if (opts.since === 'now') {\n this.db.info().then((info) => {\n /* istanbul ignore if */\n if (this.isCancelled) {\n callback(null, {status: 'cancelled'});\n return;\n }\n opts.since = info.update_seq;\n this.doChanges(opts);\n }, callback);\n return;\n }\n\n /* istanbul ignore else */\n if (PouchDB._changesFilterPlugin) {\n PouchDB._changesFilterPlugin.normalize(opts);\n if (PouchDB._changesFilterPlugin.shouldFilter(this, opts)) {\n return PouchDB._changesFilterPlugin.filter(this, opts);\n }\n } else {\n ['doc_ids', 'filter', 'selector', 'view'].forEach(function (key) {\n if (key in opts) {\n guardedConsole('warn',\n 'The \"' + key + '\" option was passed in to changes/replicate, ' +\n 'but pouchdb-changes-filter plugin is not installed, so it ' +\n 'was ignored. Please install the plugin to enable filtering.'\n );\n }\n });\n }\n\n if (!('descending' in opts)) {\n opts.descending = false;\n }\n\n // 0 and 1 should return 1 document\n opts.limit = opts.limit === 0 ? 1 : opts.limit;\n opts.complete = callback;\n var newPromise = this.db._changes(opts);\n /* istanbul ignore else */\n if (newPromise && typeof newPromise.cancel === 'function') {\n const cancel = this.cancel;\n this.cancel = (...args) => {\n newPromise.cancel();\n cancel.apply(this, args);\n };\n }\n }\n}\n\n/*\n * A generic pouch adapter\n */\n\n// Wrapper for functions that call the bulkdocs api with a single doc,\n// if the first result is an error, return an error\nfunction yankError(callback, docId) {\n return function (err, results) {\n if (err || (results[0] && results[0].error)) {\n err = err || results[0];\n err.docId = docId;\n callback(err);\n } else {\n callback(null, results.length ? results[0] : results);\n }\n };\n}\n\n// clean docs given to us by the user\nfunction cleanDocs(docs) {\n for (var i = 0; i < docs.length; i++) {\n var doc = docs[i];\n if (doc._deleted) {\n delete doc._attachments; // ignore atts for deleted docs\n } else if (doc._attachments) {\n // filter out extraneous keys from _attachments\n var atts = Object.keys(doc._attachments);\n for (var j = 0; j < atts.length; j++) {\n var att = atts[j];\n doc._attachments[att] = pick(doc._attachments[att],\n ['data', 'digest', 'content_type', 'length', 'revpos', 'stub']);\n }\n }\n }\n}\n\n// compare two docs, first by _id then by _rev\nfunction compareByIdThenRev(a, b) {\n if (a._id === b._id) {\n const aStart = a._revisions ? a._revisions.start : 0;\n const bStart = b._revisions ? b._revisions.start : 0;\n return aStart - bStart;\n }\n return a._id < b._id ? -1 : 1;\n}\n\n// for every node in a revision tree computes its distance from the closest\n// leaf\nfunction computeHeight(revs) {\n var height = {};\n var edges = [];\n traverseRevTree(revs, function (isLeaf, pos, id, prnt) {\n var rev$$1 = pos + \"-\" + id;\n if (isLeaf) {\n height[rev$$1] = 0;\n }\n if (prnt !== undefined) {\n edges.push({from: prnt, to: rev$$1});\n }\n return rev$$1;\n });\n\n edges.reverse();\n edges.forEach(function (edge) {\n if (height[edge.from] === undefined) {\n height[edge.from] = 1 + height[edge.to];\n } else {\n height[edge.from] = Math.min(height[edge.from], 1 + height[edge.to]);\n }\n });\n return height;\n}\n\nfunction allDocsKeysParse(opts) {\n var keys = ('limit' in opts) ?\n opts.keys.slice(opts.skip, opts.limit + opts.skip) :\n (opts.skip > 0) ? opts.keys.slice(opts.skip) : opts.keys;\n opts.keys = keys;\n opts.skip = 0;\n delete opts.limit;\n if (opts.descending) {\n keys.reverse();\n opts.descending = false;\n }\n}\n\n// all compaction is done in a queue, to avoid attaching\n// too many listeners at once\nfunction doNextCompaction(self) {\n var task = self._compactionQueue[0];\n var opts = task.opts;\n var callback = task.callback;\n self.get('_local/compaction').catch(function () {\n return false;\n }).then(function (doc) {\n if (doc && doc.last_seq) {\n opts.last_seq = doc.last_seq;\n }\n self._compact(opts, function (err, res) {\n /* istanbul ignore if */\n if (err) {\n callback(err);\n } else {\n callback(null, res);\n }\n nextTick(function () {\n self._compactionQueue.shift();\n if (self._compactionQueue.length) {\n doNextCompaction(self);\n }\n });\n });\n });\n}\n\nfunction appendPurgeSeq(db, docId, rev$$1) {\n return db.get('_local/purges').then(function (doc) {\n const purgeSeq = doc.purgeSeq + 1;\n doc.purges.push({\n docId,\n rev: rev$$1,\n purgeSeq,\n });\n if (doc.purges.length > self.purged_infos_limit) {\n doc.purges.splice(0, doc.purges.length - self.purged_infos_limit);\n }\n doc.purgeSeq = purgeSeq;\n return doc;\n }).catch(function (err) {\n if (err.status !== 404) {\n throw err;\n }\n return {\n _id: '_local/purges',\n purges: [{\n docId,\n rev: rev$$1,\n purgeSeq: 0,\n }],\n purgeSeq: 0,\n };\n }).then(function (doc) {\n return db.put(doc);\n });\n}\n\nfunction attachmentNameError(name) {\n if (name.charAt(0) === '_') {\n return name + ' is not a valid attachment name, attachment ' +\n 'names cannot start with \\'_\\'';\n }\n return false;\n}\n\nfunction isNotSingleDoc(doc) {\n return doc === null || typeof doc !== 'object' || Array.isArray(doc);\n}\n\nconst validRevRegex = /^\\d+-[^-]*$/;\nfunction isValidRev(rev$$1) {\n return typeof rev$$1 === 'string' && validRevRegex.test(rev$$1);\n}\n\nclass AbstractPouchDB extends EE {\n _setup() {\n this.post = adapterFun('post', function (doc, opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n if (isNotSingleDoc(doc)) {\n return callback(createError(NOT_AN_OBJECT));\n }\n this.bulkDocs({docs: [doc]}, opts, yankError(callback, doc._id));\n }).bind(this);\n\n this.put = adapterFun('put', function (doc, opts, cb) {\n if (typeof opts === 'function') {\n cb = opts;\n opts = {};\n }\n if (isNotSingleDoc(doc)) {\n return cb(createError(NOT_AN_OBJECT));\n }\n invalidIdError(doc._id);\n if ('_rev' in doc && !isValidRev(doc._rev)) {\n return cb(createError(INVALID_REV));\n }\n if (isLocalId(doc._id) && typeof this._putLocal === 'function') {\n if (doc._deleted) {\n return this._removeLocal(doc, cb);\n } else {\n return this._putLocal(doc, cb);\n }\n }\n\n const putDoc = (next) => {\n if (typeof this._put === 'function' && opts.new_edits !== false) {\n this._put(doc, opts, next);\n } else {\n this.bulkDocs({docs: [doc]}, opts, yankError(next, doc._id));\n }\n };\n\n if (opts.force && doc._rev) {\n transformForceOptionToNewEditsOption();\n putDoc(function (err) {\n var result = err ? null : {ok: true, id: doc._id, rev: doc._rev};\n cb(err, result);\n });\n } else {\n putDoc(cb);\n }\n\n function transformForceOptionToNewEditsOption() {\n var parts = doc._rev.split('-');\n var oldRevId = parts[1];\n var oldRevNum = parseInt(parts[0], 10);\n\n var newRevNum = oldRevNum + 1;\n var newRevId = rev();\n\n doc._revisions = {\n start: newRevNum,\n ids: [newRevId, oldRevId]\n };\n doc._rev = newRevNum + '-' + newRevId;\n opts.new_edits = false;\n }\n }).bind(this);\n\n this.putAttachment = adapterFun('putAttachment', function (docId, attachmentId, rev$$1, blob, type) {\n var api = this;\n if (typeof type === 'function') {\n type = blob;\n blob = rev$$1;\n rev$$1 = null;\n }\n // Lets fix in https://github.com/pouchdb/pouchdb/issues/3267\n /* istanbul ignore if */\n if (typeof type === 'undefined') {\n type = blob;\n blob = rev$$1;\n rev$$1 = null;\n }\n if (!type) {\n guardedConsole('warn', 'Attachment', attachmentId, 'on document', docId, 'is missing content_type');\n }\n\n function createAttachment(doc) {\n var prevrevpos = '_rev' in doc ? parseInt(doc._rev, 10) : 0;\n doc._attachments = doc._attachments || {};\n doc._attachments[attachmentId] = {\n content_type: type,\n data: blob,\n revpos: ++prevrevpos\n };\n return api.put(doc);\n }\n\n return api.get(docId).then(function (doc) {\n if (doc._rev !== rev$$1) {\n throw createError(REV_CONFLICT);\n }\n\n return createAttachment(doc);\n }, function (err) {\n // create new doc\n /* istanbul ignore else */\n if (err.reason === MISSING_DOC.message) {\n return createAttachment({_id: docId});\n } else {\n throw err;\n }\n });\n }).bind(this);\n\n this.removeAttachment = adapterFun('removeAttachment', function (docId, attachmentId, rev$$1, callback) {\n this.get(docId, (err, obj) => {\n /* istanbul ignore if */\n if (err) {\n callback(err);\n return;\n }\n if (obj._rev !== rev$$1) {\n callback(createError(REV_CONFLICT));\n return;\n }\n /* istanbul ignore if */\n if (!obj._attachments) {\n return callback();\n }\n delete obj._attachments[attachmentId];\n if (Object.keys(obj._attachments).length === 0) {\n delete obj._attachments;\n }\n this.put(obj, callback);\n });\n }).bind(this);\n\n this.remove = adapterFun('remove', function (docOrId, optsOrRev, opts, callback) {\n var doc;\n if (typeof optsOrRev === 'string') {\n // id, rev, opts, callback style\n doc = {\n _id: docOrId,\n _rev: optsOrRev\n };\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n } else {\n // doc, opts, callback style\n doc = docOrId;\n if (typeof optsOrRev === 'function') {\n callback = optsOrRev;\n opts = {};\n } else {\n callback = opts;\n opts = optsOrRev;\n }\n }\n opts = opts || {};\n opts.was_delete = true;\n var newDoc = {_id: doc._id, _rev: (doc._rev || opts.rev)};\n newDoc._deleted = true;\n if (isLocalId(newDoc._id) && typeof this._removeLocal === 'function') {\n return this._removeLocal(doc, callback);\n }\n this.bulkDocs({docs: [newDoc]}, opts, yankError(callback, newDoc._id));\n }).bind(this);\n\n this.revsDiff = adapterFun('revsDiff', function (req, opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n var ids = Object.keys(req);\n\n if (!ids.length) {\n return callback(null, {});\n }\n\n var count = 0;\n var missing = new Map();\n\n function addToMissing(id, revId) {\n if (!missing.has(id)) {\n missing.set(id, {missing: []});\n }\n missing.get(id).missing.push(revId);\n }\n\n function processDoc(id, rev_tree) {\n // Is this fast enough? Maybe we should switch to a set simulated by a map\n var missingForId = req[id].slice(0);\n traverseRevTree(rev_tree, function (isLeaf, pos, revHash, ctx,\n opts) {\n var rev$$1 = pos + '-' + revHash;\n var idx = missingForId.indexOf(rev$$1);\n if (idx === -1) {\n return;\n }\n\n missingForId.splice(idx, 1);\n /* istanbul ignore if */\n if (opts.status !== 'available') {\n addToMissing(id, rev$$1);\n }\n });\n\n // Traversing the tree is synchronous, so now `missingForId` contains\n // revisions that were not found in the tree\n missingForId.forEach(function (rev$$1) {\n addToMissing(id, rev$$1);\n });\n }\n\n ids.forEach(function (id) {\n this._getRevisionTree(id, function (err, rev_tree) {\n if (err && err.status === 404 && err.message === 'missing') {\n missing.set(id, {missing: req[id]});\n } else if (err) {\n /* istanbul ignore next */\n return callback(err);\n } else {\n processDoc(id, rev_tree);\n }\n\n if (++count === ids.length) {\n // convert LazyMap to object\n var missingObj = {};\n missing.forEach(function (value, key) {\n missingObj[key] = value;\n });\n return callback(null, missingObj);\n }\n });\n }, this);\n }).bind(this);\n\n // _bulk_get API for faster replication, as described in\n // https://github.com/apache/couchdb-chttpd/pull/33\n // At the \"abstract\" level, it will just run multiple get()s in\n // parallel, because this isn't much of a performance cost\n // for local databases (except the cost of multiple transactions, which is\n // small). The http adapter overrides this in order\n // to do a more efficient single HTTP request.\n this.bulkGet = adapterFun('bulkGet', function (opts, callback) {\n bulkGet(this, opts, callback);\n }).bind(this);\n\n // compact one document and fire callback\n // by compacting we mean removing all revisions which\n // are further from the leaf in revision tree than max_height\n this.compactDocument = adapterFun('compactDocument', function (docId, maxHeight, callback) {\n this._getRevisionTree(docId, (err, revTree) => {\n /* istanbul ignore if */\n if (err) {\n return callback(err);\n }\n var height = computeHeight(revTree);\n var candidates = [];\n var revs = [];\n Object.keys(height).forEach(function (rev$$1) {\n if (height[rev$$1] > maxHeight) {\n candidates.push(rev$$1);\n }\n });\n\n traverseRevTree(revTree, function (isLeaf, pos, revHash, ctx, opts) {\n var rev$$1 = pos + '-' + revHash;\n if (opts.status === 'available' && candidates.indexOf(rev$$1) !== -1) {\n revs.push(rev$$1);\n }\n });\n this._doCompaction(docId, revs, callback);\n });\n }).bind(this);\n\n // compact the whole database using single document\n // compaction\n this.compact = adapterFun('compact', function (opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n\n opts = opts || {};\n\n this._compactionQueue = this._compactionQueue || [];\n this._compactionQueue.push({opts, callback});\n if (this._compactionQueue.length === 1) {\n doNextCompaction(this);\n }\n }).bind(this);\n\n /* Begin api wrappers. Specific functionality to storage belongs in the _[method] */\n this.get = adapterFun('get', function (id, opts, cb) {\n if (typeof opts === 'function') {\n cb = opts;\n opts = {};\n }\n opts = opts || {};\n if (typeof id !== 'string') {\n return cb(createError(INVALID_ID));\n }\n if (isLocalId(id) && typeof this._getLocal === 'function') {\n return this._getLocal(id, cb);\n }\n var leaves = [];\n\n const finishOpenRevs = () => {\n var result = [];\n var count = leaves.length;\n /* istanbul ignore if */\n if (!count) {\n return cb(null, result);\n }\n\n // order with open_revs is unspecified\n leaves.forEach((leaf) => {\n this.get(id, {\n rev: leaf,\n revs: opts.revs,\n latest: opts.latest,\n attachments: opts.attachments,\n binary: opts.binary\n }, function (err, doc) {\n if (!err) {\n // using latest=true can produce duplicates\n var existing;\n for (var i = 0, l = result.length; i < l; i++) {\n if (result[i].ok && result[i].ok._rev === doc._rev) {\n existing = true;\n break;\n }\n }\n if (!existing) {\n result.push({ok: doc});\n }\n } else {\n result.push({missing: leaf});\n }\n count--;\n if (!count) {\n cb(null, result);\n }\n });\n });\n };\n\n if (opts.open_revs) {\n if (opts.open_revs === \"all\") {\n this._getRevisionTree(id, function (err, rev_tree) {\n /* istanbul ignore if */\n if (err) {\n return cb(err);\n }\n leaves = collectLeaves(rev_tree).map(function (leaf) {\n return leaf.rev;\n });\n finishOpenRevs();\n });\n } else {\n if (Array.isArray(opts.open_revs)) {\n leaves = opts.open_revs;\n for (var i = 0; i < leaves.length; i++) {\n var l = leaves[i];\n // looks like it's the only thing couchdb checks\n if (!isValidRev(l)) {\n return cb(createError(INVALID_REV));\n }\n }\n finishOpenRevs();\n } else {\n return cb(createError(UNKNOWN_ERROR, 'function_clause'));\n }\n }\n return; // open_revs does not like other options\n }\n\n return this._get(id, opts, (err, result) => {\n if (err) {\n err.docId = id;\n return cb(err);\n }\n\n var doc = result.doc;\n var metadata = result.metadata;\n var ctx = result.ctx;\n\n if (opts.conflicts) {\n var conflicts = collectConflicts(metadata);\n if (conflicts.length) {\n doc._conflicts = conflicts;\n }\n }\n\n if (isDeleted(metadata, doc._rev)) {\n doc._deleted = true;\n }\n\n if (opts.revs || opts.revs_info) {\n var splittedRev = doc._rev.split('-');\n var revNo = parseInt(splittedRev[0], 10);\n var revHash = splittedRev[1];\n\n var paths = rootToLeaf(metadata.rev_tree);\n var path = null;\n\n for (var i = 0; i < paths.length; i++) {\n var currentPath = paths[i];\n const hashIndex = currentPath.ids.findIndex(x => x.id === revHash);\n var hashFoundAtRevPos = hashIndex === (revNo - 1);\n\n if (hashFoundAtRevPos || (!path && hashIndex !== -1)) {\n path = currentPath;\n }\n }\n\n /* istanbul ignore if */\n if (!path) {\n err = new Error('invalid rev tree');\n err.docId = id;\n return cb(err);\n }\n\n const pathId = doc._rev.split('-')[1];\n const indexOfRev = path.ids.findIndex(x => x.id === pathId) + 1;\n var howMany = path.ids.length - indexOfRev;\n path.ids.splice(indexOfRev, howMany);\n path.ids.reverse();\n\n if (opts.revs) {\n doc._revisions = {\n start: (path.pos + path.ids.length) - 1,\n ids: path.ids.map(function (rev$$1) {\n return rev$$1.id;\n })\n };\n }\n if (opts.revs_info) {\n var pos = path.pos + path.ids.length;\n doc._revs_info = path.ids.map(function (rev$$1) {\n pos--;\n return {\n rev: pos + '-' + rev$$1.id,\n status: rev$$1.opts.status\n };\n });\n }\n }\n\n if (opts.attachments && doc._attachments) {\n var attachments = doc._attachments;\n var count = Object.keys(attachments).length;\n if (count === 0) {\n return cb(null, doc);\n }\n Object.keys(attachments).forEach((key) => {\n this._getAttachment(doc._id, key, attachments[key], {\n binary: opts.binary,\n metadata,\n ctx\n }, function (err, data) {\n var att = doc._attachments[key];\n att.data = data;\n delete att.stub;\n delete att.length;\n if (!--count) {\n cb(null, doc);\n }\n });\n });\n } else {\n if (doc._attachments) {\n for (var key in doc._attachments) {\n /* istanbul ignore else */\n if (Object.prototype.hasOwnProperty.call(doc._attachments, key)) {\n doc._attachments[key].stub = true;\n }\n }\n }\n cb(null, doc);\n }\n });\n }).bind(this);\n\n // TODO: I don't like this, it forces an extra read for every\n // attachment read and enforces a confusing api between\n // adapter.js and the adapter implementation\n this.getAttachment = adapterFun('getAttachment', function (docId, attachmentId, opts, callback) {\n if (opts instanceof Function) {\n callback = opts;\n opts = {};\n }\n this._get(docId, opts, (err, res) => {\n if (err) {\n return callback(err);\n }\n if (res.doc._attachments && res.doc._attachments[attachmentId]) {\n opts.ctx = res.ctx;\n opts.binary = true;\n opts.metadata = res.metadata;\n this._getAttachment(docId, attachmentId,\n res.doc._attachments[attachmentId], opts, callback);\n } else {\n return callback(createError(MISSING_DOC));\n }\n });\n }).bind(this);\n\n this.allDocs = adapterFun('allDocs', function (opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n opts.skip = typeof opts.skip !== 'undefined' ? opts.skip : 0;\n if (opts.start_key) {\n opts.startkey = opts.start_key;\n }\n if (opts.end_key) {\n opts.endkey = opts.end_key;\n }\n if ('keys' in opts) {\n if (!Array.isArray(opts.keys)) {\n return callback(new TypeError('options.keys must be an array'));\n }\n var incompatibleOpt =\n ['startkey', 'endkey', 'key'].filter(function (incompatibleOpt) {\n return incompatibleOpt in opts;\n })[0];\n if (incompatibleOpt) {\n callback(createError(QUERY_PARSE_ERROR,\n 'Query parameter `' + incompatibleOpt +\n '` is not compatible with multi-get'\n ));\n return;\n }\n if (!isRemote(this)) {\n allDocsKeysParse(opts);\n if (opts.keys.length === 0) {\n return this._allDocs({limit: 0}, callback);\n }\n }\n }\n\n return this._allDocs(opts, callback);\n }).bind(this);\n\n this.close = adapterFun('close', function (callback) {\n this._closed = true;\n this.emit('closed');\n return this._close(callback);\n }).bind(this);\n\n this.info = adapterFun('info', function (callback) {\n this._info((err, info) => {\n if (err) {\n return callback(err);\n }\n // assume we know better than the adapter, unless it informs us\n info.db_name = info.db_name || this.name;\n info.auto_compaction = !!(this.auto_compaction && !isRemote(this));\n info.adapter = this.adapter;\n callback(null, info);\n });\n }).bind(this);\n\n this.id = adapterFun('id', function (callback) {\n return this._id(callback);\n }).bind(this);\n\n this.bulkDocs = adapterFun('bulkDocs', function (req, opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n\n opts = opts || {};\n\n if (Array.isArray(req)) {\n req = {\n docs: req\n };\n }\n\n if (!req || !req.docs || !Array.isArray(req.docs)) {\n return callback(createError(MISSING_BULK_DOCS));\n }\n\n for (var i = 0; i < req.docs.length; ++i) {\n const doc = req.docs[i];\n if (isNotSingleDoc(doc)) {\n return callback(createError(NOT_AN_OBJECT));\n }\n if ('_rev' in doc && !isValidRev(doc._rev)) {\n return callback(createError(INVALID_REV));\n }\n }\n\n var attachmentError;\n req.docs.forEach(function (doc) {\n if (doc._attachments) {\n Object.keys(doc._attachments).forEach(function (name) {\n attachmentError = attachmentError || attachmentNameError(name);\n if (!doc._attachments[name].content_type) {\n guardedConsole('warn', 'Attachment', name, 'on document', doc._id, 'is missing content_type');\n }\n });\n }\n });\n\n if (attachmentError) {\n return callback(createError(BAD_REQUEST, attachmentError));\n }\n\n if (!('new_edits' in opts)) {\n if ('new_edits' in req) {\n opts.new_edits = req.new_edits;\n } else {\n opts.new_edits = true;\n }\n }\n\n var adapter = this;\n if (!opts.new_edits && !isRemote(adapter)) {\n // ensure revisions of the same doc are sorted, so that\n // the local adapter processes them correctly (#2935)\n req.docs.sort(compareByIdThenRev);\n }\n\n cleanDocs(req.docs);\n\n // in the case of conflicts, we want to return the _ids to the user\n // however, the underlying adapter may destroy the docs array, so\n // create a copy here\n var ids = req.docs.map(function (doc) {\n return doc._id;\n });\n\n this._bulkDocs(req, opts, function (err, res) {\n if (err) {\n return callback(err);\n }\n if (!opts.new_edits) {\n // this is what couch does when new_edits is false\n res = res.filter(function (x) {\n return x.error;\n });\n }\n // add ids for error/conflict responses (not required for CouchDB)\n if (!isRemote(adapter)) {\n for (var i = 0, l = res.length; i < l; i++) {\n res[i].id = res[i].id || ids[i];\n }\n }\n\n callback(null, res);\n });\n }).bind(this);\n\n this.registerDependentDatabase = adapterFun('registerDependentDatabase', function (dependentDb, callback) {\n var dbOptions = clone(this.__opts);\n if (this.__opts.view_adapter) {\n dbOptions.adapter = this.__opts.view_adapter;\n }\n\n var depDB = new this.constructor(dependentDb, dbOptions);\n\n function diffFun(doc) {\n doc.dependentDbs = doc.dependentDbs || {};\n if (doc.dependentDbs[dependentDb]) {\n return false; // no update required\n }\n doc.dependentDbs[dependentDb] = true;\n return doc;\n }\n upsert(this, '_local/_pouch_dependentDbs', diffFun).then(function () {\n callback(null, {db: depDB});\n }).catch(callback);\n }).bind(this);\n\n this.destroy = adapterFun('destroy', function (opts, callback) {\n\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n\n var usePrefix = 'use_prefix' in this ? this.use_prefix : true;\n\n const destroyDb = () => {\n // call destroy method of the particular adaptor\n this._destroy(opts, (err, resp) => {\n if (err) {\n return callback(err);\n }\n this._destroyed = true;\n this.emit('destroyed');\n callback(null, resp || { 'ok': true });\n });\n };\n\n if (isRemote(this)) {\n // no need to check for dependent DBs if it's a remote DB\n return destroyDb();\n }\n\n this.get('_local/_pouch_dependentDbs', (err, localDoc) => {\n if (err) {\n /* istanbul ignore if */\n if (err.status !== 404) {\n return callback(err);\n } else { // no dependencies\n return destroyDb();\n }\n }\n var dependentDbs = localDoc.dependentDbs;\n var PouchDB = this.constructor;\n var deletedMap = Object.keys(dependentDbs).map((name) => {\n // use_prefix is only false in the browser\n /* istanbul ignore next */\n var trueName = usePrefix ?\n name.replace(new RegExp('^' + PouchDB.prefix), '') : name;\n return new PouchDB(trueName, this.__opts).destroy();\n });\n Promise.all(deletedMap).then(destroyDb, callback);\n });\n }).bind(this);\n }\n\n _compact(opts, callback) {\n var changesOpts = {\n return_docs: false,\n last_seq: opts.last_seq || 0,\n since: opts.last_seq || 0\n };\n var promises = [];\n\n var taskId;\n var compactedDocs = 0;\n\n const onChange = (row) => {\n this.activeTasks.update(taskId, {\n completed_items: ++compactedDocs\n });\n promises.push(this.compactDocument(row.id, 0));\n };\n const onError = (err) => {\n this.activeTasks.remove(taskId, err);\n callback(err);\n };\n const onComplete = (resp) => {\n var lastSeq = resp.last_seq;\n Promise.all(promises).then(() => {\n return upsert(this, '_local/compaction', (doc) => {\n if (!doc.last_seq || doc.last_seq < lastSeq) {\n doc.last_seq = lastSeq;\n return doc;\n }\n return false; // somebody else got here first, don't update\n });\n }).then(() => {\n this.activeTasks.remove(taskId);\n callback(null, {ok: true});\n }).catch(onError);\n };\n\n this.info().then((info) => {\n taskId = this.activeTasks.add({\n name: 'database_compaction',\n total_items: info.update_seq - changesOpts.last_seq,\n });\n\n this.changes(changesOpts)\n .on('change', onChange)\n .on('complete', onComplete)\n .on('error', onError);\n });\n }\n\n changes(opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n\n opts = opts || {};\n\n // By default set return_docs to false if the caller has opts.live = true,\n // this will prevent us from collecting the set of changes indefinitely\n // resulting in growing memory\n opts.return_docs = ('return_docs' in opts) ? opts.return_docs : !opts.live;\n\n return new Changes$1(this, opts, callback);\n }\n\n type() {\n return (typeof this._type === 'function') ? this._type() : this.adapter;\n }\n}\n\n// The abstract purge implementation expects a doc id and the rev of a leaf node in that doc.\n// It will return errors if the rev doesn’t exist or isn’t a leaf.\nAbstractPouchDB.prototype.purge = adapterFun('_purge', function (docId, rev$$1, callback) {\n if (typeof this._purge === 'undefined') {\n return callback(createError(UNKNOWN_ERROR, 'Purge is not implemented in the ' + this.adapter + ' adapter.'));\n }\n var self = this;\n\n self._getRevisionTree(docId, (error, revs) => {\n if (error) {\n return callback(error);\n }\n if (!revs) {\n return callback(createError(MISSING_DOC));\n }\n let path;\n try {\n path = findPathToLeaf(revs, rev$$1);\n } catch (error) {\n return callback(error.message || error);\n }\n self._purge(docId, path, (error, result) => {\n if (error) {\n return callback(error);\n } else {\n appendPurgeSeq(self, docId, rev$$1).then(function () {\n return callback(null, result);\n });\n }\n });\n });\n});\n\nclass TaskQueue {\n constructor() {\n this.isReady = false;\n this.failed = false;\n this.queue = [];\n }\n\n execute() {\n var fun;\n if (this.failed) {\n while ((fun = this.queue.shift())) {\n fun(this.failed);\n }\n } else {\n while ((fun = this.queue.shift())) {\n fun();\n }\n }\n }\n\n fail(err) {\n this.failed = err;\n this.execute();\n }\n\n ready(db) {\n this.isReady = true;\n this.db = db;\n this.execute();\n }\n\n addTask(fun) {\n this.queue.push(fun);\n if (this.failed) {\n this.execute();\n }\n }\n}\n\nfunction parseAdapter(name, opts) {\n var match = name.match(/([a-z-]*):\\/\\/(.*)/);\n if (match) {\n // the http adapter expects the fully qualified name\n return {\n name: /https?/.test(match[1]) ? match[1] + '://' + match[2] : match[2],\n adapter: match[1]\n };\n }\n\n var adapters = PouchDB.adapters;\n var preferredAdapters = PouchDB.preferredAdapters;\n var prefix = PouchDB.prefix;\n var adapterName = opts.adapter;\n\n if (!adapterName) { // automatically determine adapter\n for (var i = 0; i < preferredAdapters.length; ++i) {\n adapterName = preferredAdapters[i];\n // check for browsers that have been upgraded from websql-only to websql+idb\n /* istanbul ignore if */\n if (adapterName === 'idb' && 'websql' in adapters &&\n hasLocalStorage() && localStorage['_pouch__websqldb_' + prefix + name]) {\n // log it, because this can be confusing during development\n guardedConsole('log', 'PouchDB is downgrading \"' + name + '\" to WebSQL to' +\n ' avoid data loss, because it was already opened with WebSQL.');\n continue; // keep using websql to avoid user data loss\n }\n break;\n }\n }\n\n var adapter = adapters[adapterName];\n\n // if adapter is invalid, then an error will be thrown later\n var usePrefix = (adapter && 'use_prefix' in adapter) ?\n adapter.use_prefix : true;\n\n return {\n name: usePrefix ? (prefix + name) : name,\n adapter: adapterName\n };\n}\n\nfunction inherits(A, B) {\n A.prototype = Object.create(B.prototype, {\n constructor: { value: A }\n });\n}\n\nfunction createClass(parent, init) {\n let klass = function (...args) {\n if (!(this instanceof klass)) {\n return new klass(...args);\n }\n init.apply(this, args);\n };\n inherits(klass, parent);\n return klass;\n}\n\n// OK, so here's the deal. Consider this code:\n// var db1 = new PouchDB('foo');\n// var db2 = new PouchDB('foo');\n// db1.destroy();\n// ^ these two both need to emit 'destroyed' events,\n// as well as the PouchDB constructor itself.\n// So we have one db object (whichever one got destroy() called on it)\n// responsible for emitting the initial event, which then gets emitted\n// by the constructor, which then broadcasts it to any other dbs\n// that may have been created with the same name.\nfunction prepareForDestruction(self) {\n\n function onDestroyed(from_constructor) {\n self.removeListener('closed', onClosed);\n if (!from_constructor) {\n self.constructor.emit('destroyed', self.name);\n }\n }\n\n function onClosed() {\n self.removeListener('destroyed', onDestroyed);\n self.constructor.emit('unref', self);\n }\n\n self.once('destroyed', onDestroyed);\n self.once('closed', onClosed);\n self.constructor.emit('ref', self);\n}\n\nclass PouchInternal extends AbstractPouchDB {\n constructor(name, opts) {\n super();\n this._setup(name, opts);\n }\n\n _setup(name, opts) {\n super._setup();\n opts = opts || {};\n\n if (name && typeof name === 'object') {\n opts = name;\n name = opts.name;\n delete opts.name;\n }\n\n if (opts.deterministic_revs === undefined) {\n opts.deterministic_revs = true;\n }\n\n this.__opts = opts = clone(opts);\n\n this.auto_compaction = opts.auto_compaction;\n this.purged_infos_limit = opts.purged_infos_limit || 1000;\n this.prefix = PouchDB.prefix;\n\n if (typeof name !== 'string') {\n throw new Error('Missing/invalid DB name');\n }\n\n var prefixedName = (opts.prefix || '') + name;\n var backend = parseAdapter(prefixedName, opts);\n\n opts.name = backend.name;\n opts.adapter = opts.adapter || backend.adapter;\n\n this.name = name;\n this._adapter = opts.adapter;\n PouchDB.emit('debug', ['adapter', 'Picked adapter: ', opts.adapter]);\n\n if (!PouchDB.adapters[opts.adapter] ||\n !PouchDB.adapters[opts.adapter].valid()) {\n throw new Error('Invalid Adapter: ' + opts.adapter);\n }\n\n if (opts.view_adapter) {\n if (!PouchDB.adapters[opts.view_adapter] ||\n !PouchDB.adapters[opts.view_adapter].valid()) {\n throw new Error('Invalid View Adapter: ' + opts.view_adapter);\n }\n }\n\n this.taskqueue = new TaskQueue();\n\n this.adapter = opts.adapter;\n\n PouchDB.adapters[opts.adapter].call(this, opts, (err) => {\n if (err) {\n return this.taskqueue.fail(err);\n }\n prepareForDestruction(this);\n\n this.emit('created', this);\n PouchDB.emit('created', this.name);\n this.taskqueue.ready(this);\n });\n }\n}\n\nconst PouchDB = createClass(PouchInternal, function (name, opts) {\n PouchInternal.prototype._setup.call(this, name, opts);\n});\n\nvar f$1 = fetch;\nvar h = Headers;\n\nclass ActiveTasks {\n constructor() {\n this.tasks = {};\n }\n\n list() {\n return Object.values(this.tasks);\n }\n\n add(task) {\n const id = v4();\n this.tasks[id] = {\n id,\n name: task.name,\n total_items: task.total_items,\n created_at: new Date().toJSON()\n };\n return id;\n }\n\n get(id) {\n return this.tasks[id];\n }\n\n /* eslint-disable no-unused-vars */\n remove(id, reason) {\n delete this.tasks[id];\n return this.tasks;\n }\n\n update(id, updatedTask) {\n const task = this.tasks[id];\n if (typeof task !== 'undefined') {\n const mergedTask = {\n id: task.id,\n name: task.name,\n created_at: task.created_at,\n total_items: updatedTask.total_items || task.total_items,\n completed_items: updatedTask.completed_items || task.completed_items,\n updated_at: new Date().toJSON()\n };\n this.tasks[id] = mergedTask;\n }\n return this.tasks;\n }\n}\n\nPouchDB.adapters = {};\nPouchDB.preferredAdapters = [];\n\nPouchDB.prefix = '_pouch_';\n\nvar eventEmitter = new EE();\n\nfunction setUpEventEmitter(Pouch) {\n Object.keys(EE.prototype).forEach(function (key) {\n if (typeof EE.prototype[key] === 'function') {\n Pouch[key] = eventEmitter[key].bind(eventEmitter);\n }\n });\n\n // these are created in constructor.js, and allow us to notify each DB with\n // the same name that it was destroyed, via the constructor object\n var destructListeners = Pouch._destructionListeners = new Map();\n\n Pouch.on('ref', function onConstructorRef(db) {\n if (!destructListeners.has(db.name)) {\n destructListeners.set(db.name, []);\n }\n destructListeners.get(db.name).push(db);\n });\n\n Pouch.on('unref', function onConstructorUnref(db) {\n if (!destructListeners.has(db.name)) {\n return;\n }\n var dbList = destructListeners.get(db.name);\n var pos = dbList.indexOf(db);\n if (pos < 0) {\n /* istanbul ignore next */\n return;\n }\n dbList.splice(pos, 1);\n if (dbList.length > 1) {\n /* istanbul ignore next */\n destructListeners.set(db.name, dbList);\n } else {\n destructListeners.delete(db.name);\n }\n });\n\n Pouch.on('destroyed', function onConstructorDestroyed(name) {\n if (!destructListeners.has(name)) {\n return;\n }\n var dbList = destructListeners.get(name);\n destructListeners.delete(name);\n dbList.forEach(function (db) {\n db.emit('destroyed',true);\n });\n });\n}\n\nsetUpEventEmitter(PouchDB);\n\nPouchDB.adapter = function (id, obj, addToPreferredAdapters) {\n /* istanbul ignore else */\n if (obj.valid()) {\n PouchDB.adapters[id] = obj;\n if (addToPreferredAdapters) {\n PouchDB.preferredAdapters.push(id);\n }\n }\n};\n\nPouchDB.plugin = function (obj) {\n if (typeof obj === 'function') { // function style for plugins\n obj(PouchDB);\n } else if (typeof obj !== 'object' || Object.keys(obj).length === 0) {\n throw new Error('Invalid plugin: got \"' + obj + '\", expected an object or a function');\n } else {\n Object.keys(obj).forEach(function (id) { // object style for plugins\n PouchDB.prototype[id] = obj[id];\n });\n }\n if (this.__defaults) {\n PouchDB.__defaults = Object.assign({}, this.__defaults);\n }\n return PouchDB;\n};\n\nPouchDB.defaults = function (defaultOpts) {\n let PouchWithDefaults = createClass(PouchDB, function (name, opts) {\n opts = opts || {};\n\n if (name && typeof name === 'object') {\n opts = name;\n name = opts.name;\n delete opts.name;\n }\n\n opts = Object.assign({}, PouchWithDefaults.__defaults, opts);\n PouchDB.call(this, name, opts);\n });\n\n PouchWithDefaults.preferredAdapters = PouchDB.preferredAdapters.slice();\n Object.keys(PouchDB).forEach(function (key) {\n if (!(key in PouchWithDefaults)) {\n PouchWithDefaults[key] = PouchDB[key];\n }\n });\n\n // make default options transitive\n // https://github.com/pouchdb/pouchdb/issues/5922\n PouchWithDefaults.__defaults = Object.assign({}, this.__defaults, defaultOpts);\n\n return PouchWithDefaults;\n};\n\nPouchDB.fetch = function (url, opts) {\n return f$1(url, opts);\n};\n\nPouchDB.prototype.activeTasks = PouchDB.activeTasks = new ActiveTasks();\n\n// managed automatically by set-version.js\nvar version = \"9.0.0\";\n\n// this would just be \"return doc[field]\", but fields\n// can be \"deep\" due to dot notation\nfunction getFieldFromDoc(doc, parsedField) {\n var value = doc;\n for (var i = 0, len = parsedField.length; i < len; i++) {\n var key = parsedField[i];\n value = value[key];\n if (!value) {\n break;\n }\n }\n return value;\n}\n\nfunction compare(left, right) {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\n// Converts a string in dot notation to an array of its components, with backslash escaping\nfunction parseField(fieldName) {\n // fields may be deep (e.g. \"foo.bar.baz\"), so parse\n var fields = [];\n var current = '';\n for (var i = 0, len = fieldName.length; i < len; i++) {\n var ch = fieldName[i];\n if (i > 0 && fieldName[i - 1] === '\\\\' && (ch === '$' || ch === '.')) {\n // escaped delimiter\n current = current.substring(0, current.length - 1) + ch;\n } else if (ch === '.') {\n // When `.` is not escaped (above), it is a field delimiter\n fields.push(current);\n current = '';\n } else { // normal character\n current += ch;\n }\n }\n fields.push(current);\n return fields;\n}\n\nvar combinationFields = ['$or', '$nor', '$not'];\nfunction isCombinationalField(field) {\n return combinationFields.indexOf(field) > -1;\n}\n\nfunction getKey(obj) {\n return Object.keys(obj)[0];\n}\n\nfunction getValue(obj) {\n return obj[getKey(obj)];\n}\n\n\n// flatten an array of selectors joined by an $and operator\nfunction mergeAndedSelectors(selectors) {\n\n // sort to ensure that e.g. if the user specified\n // $and: [{$gt: 'a'}, {$gt: 'b'}], then it's collapsed into\n // just {$gt: 'b'}\n var res = {};\n var first = {$or: true, $nor: true};\n\n selectors.forEach(function (selector) {\n Object.keys(selector).forEach(function (field) {\n var matcher = selector[field];\n if (typeof matcher !== 'object') {\n matcher = {$eq: matcher};\n }\n\n if (isCombinationalField(field)) {\n // or, nor\n if (matcher instanceof Array) {\n if (first[field]) {\n first[field] = false;\n res[field] = matcher;\n return;\n }\n\n var entries = [];\n res[field].forEach(function (existing) {\n Object.keys(matcher).forEach(function (key) {\n var m = matcher[key];\n var longest = Math.max(Object.keys(existing).length, Object.keys(m).length);\n var merged = mergeAndedSelectors([existing, m]);\n if (Object.keys(merged).length <= longest) {\n // we have a situation like: (a :{$eq :1} || ...) && (a {$eq: 2} || ...)\n // merging would produce a $eq 2 when actually we shouldn't ever match against these merged conditions\n // merged should always contain more values to be valid\n return;\n }\n entries.push(merged);\n });\n });\n res[field] = entries;\n } else {\n // not\n res[field] = mergeAndedSelectors([matcher]);\n }\n } else {\n var fieldMatchers = res[field] = res[field] || {};\n Object.keys(matcher).forEach(function (operator) {\n var value = matcher[operator];\n\n if (operator === '$gt' || operator === '$gte') {\n return mergeGtGte(operator, value, fieldMatchers);\n } else if (operator === '$lt' || operator === '$lte') {\n return mergeLtLte(operator, value, fieldMatchers);\n } else if (operator === '$ne') {\n return mergeNe(value, fieldMatchers);\n } else if (operator === '$eq') {\n return mergeEq(value, fieldMatchers);\n } else if (operator === \"$regex\") {\n return mergeRegex(value, fieldMatchers);\n }\n fieldMatchers[operator] = value;\n });\n }\n });\n });\n\n return res;\n}\n\n\n\n// collapse logically equivalent gt/gte values\nfunction mergeGtGte(operator, value, fieldMatchers) {\n if (typeof fieldMatchers.$eq !== 'undefined') {\n return; // do nothing\n }\n if (typeof fieldMatchers.$gte !== 'undefined') {\n if (operator === '$gte') {\n if (value > fieldMatchers.$gte) { // more specificity\n fieldMatchers.$gte = value;\n }\n } else { // operator === '$gt'\n if (value >= fieldMatchers.$gte) { // more specificity\n delete fieldMatchers.$gte;\n fieldMatchers.$gt = value;\n }\n }\n } else if (typeof fieldMatchers.$gt !== 'undefined') {\n if (operator === '$gte') {\n if (value > fieldMatchers.$gt) { // more specificity\n delete fieldMatchers.$gt;\n fieldMatchers.$gte = value;\n }\n } else { // operator === '$gt'\n if (value > fieldMatchers.$gt) { // more specificity\n fieldMatchers.$gt = value;\n }\n }\n } else {\n fieldMatchers[operator] = value;\n }\n}\n\n// collapse logically equivalent lt/lte values\nfunction mergeLtLte(operator, value, fieldMatchers) {\n if (typeof fieldMatchers.$eq !== 'undefined') {\n return; // do nothing\n }\n if (typeof fieldMatchers.$lte !== 'undefined') {\n if (operator === '$lte') {\n if (value < fieldMatchers.$lte) { // more specificity\n fieldMatchers.$lte = value;\n }\n } else { // operator === '$gt'\n if (value <= fieldMatchers.$lte) { // more specificity\n delete fieldMatchers.$lte;\n fieldMatchers.$lt = value;\n }\n }\n } else if (typeof fieldMatchers.$lt !== 'undefined') {\n if (operator === '$lte') {\n if (value < fieldMatchers.$lt) { // more specificity\n delete fieldMatchers.$lt;\n fieldMatchers.$lte = value;\n }\n } else { // operator === '$gt'\n if (value < fieldMatchers.$lt) { // more specificity\n fieldMatchers.$lt = value;\n }\n }\n } else {\n fieldMatchers[operator] = value;\n }\n}\n\n// combine $ne values into one array\nfunction mergeNe(value, fieldMatchers) {\n if ('$ne' in fieldMatchers) {\n // there are many things this could \"not\" be\n fieldMatchers.$ne.push(value);\n } else { // doesn't exist yet\n fieldMatchers.$ne = [value];\n }\n}\n\n// add $eq into the mix\nfunction mergeEq(value, fieldMatchers) {\n // these all have less specificity than the $eq\n // TODO: check for user errors here\n delete fieldMatchers.$gt;\n delete fieldMatchers.$gte;\n delete fieldMatchers.$lt;\n delete fieldMatchers.$lte;\n delete fieldMatchers.$ne;\n fieldMatchers.$eq = value;\n}\n\n// combine $regex values into one array\nfunction mergeRegex(value, fieldMatchers) {\n if ('$regex' in fieldMatchers) {\n // a value could match multiple regexes\n fieldMatchers.$regex.push(value);\n } else { // doesn't exist yet\n fieldMatchers.$regex = [value];\n }\n}\n\n//#7458: execute function mergeAndedSelectors on nested $and\nfunction mergeAndedSelectorsNested(obj) {\n for (var prop in obj) {\n if (Array.isArray(obj)) {\n for (var i in obj) {\n if (obj[i]['$and']) {\n obj[i] = mergeAndedSelectors(obj[i]['$and']);\n }\n }\n }\n var value = obj[prop];\n if (typeof value === 'object') {\n mergeAndedSelectorsNested(value); // <- recursive call\n }\n }\n return obj;\n}\n\n//#7458: determine id $and is present in selector (at any level)\nfunction isAndInSelector(obj, isAnd) {\n for (var prop in obj) {\n if (prop === '$and') {\n isAnd = true;\n }\n var value = obj[prop];\n if (typeof value === 'object') {\n isAnd = isAndInSelector(value, isAnd); // <- recursive call\n }\n }\n return isAnd;\n}\n\n//\n// normalize the selector\n//\nfunction massageSelector(input) {\n var result = clone(input);\n\n //#7458: if $and is present in selector (at any level) merge nested $and\n if (isAndInSelector(result, false)) {\n result = mergeAndedSelectorsNested(result);\n if ('$and' in result) {\n result = mergeAndedSelectors(result['$and']);\n }\n }\n\n ['$or', '$nor'].forEach(function (orOrNor) {\n if (orOrNor in result) {\n // message each individual selector\n // e.g. {foo: 'bar'} becomes {foo: {$eq: 'bar'}}\n result[orOrNor].forEach(function (subSelector) {\n var fields = Object.keys(subSelector);\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n var matcher = subSelector[field];\n if (typeof matcher !== 'object' || matcher === null) {\n subSelector[field] = {$eq: matcher};\n }\n }\n });\n }\n });\n\n if ('$not' in result) {\n //This feels a little like forcing, but it will work for now,\n //I would like to come back to this and make the merging of selectors a little more generic\n result['$not'] = mergeAndedSelectors([result['$not']]);\n }\n\n var fields = Object.keys(result);\n\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n var matcher = result[field];\n\n if (typeof matcher !== 'object' || matcher === null) {\n matcher = {$eq: matcher};\n }\n result[field] = matcher;\n }\n\n normalizeArrayOperators(result);\n\n return result;\n}\n\n//\n// The $ne and $regex values must be placed in an array because these operators can be used multiple times on the same field.\n// When $and is used, mergeAndedSelectors takes care of putting some of them into arrays, otherwise it's done here.\n//\nfunction normalizeArrayOperators(selector) {\n Object.keys(selector).forEach(function (field) {\n var matcher = selector[field];\n\n if (Array.isArray(matcher)) {\n matcher.forEach(function (matcherItem) {\n if (matcherItem && typeof matcherItem === 'object') {\n normalizeArrayOperators(matcherItem);\n }\n });\n } else if (field === '$ne') {\n selector.$ne = [matcher];\n } else if (field === '$regex') {\n selector.$regex = [matcher];\n } else if (matcher && typeof matcher === 'object') {\n normalizeArrayOperators(matcher);\n }\n });\n}\n\nfunction pad(str, padWith, upToLength) {\n var padding = '';\n var targetLength = upToLength - str.length;\n /* istanbul ignore next */\n while (padding.length < targetLength) {\n padding += padWith;\n }\n return padding;\n}\n\nfunction padLeft(str, padWith, upToLength) {\n var padding = pad(str, padWith, upToLength);\n return padding + str;\n}\n\nvar MIN_MAGNITUDE = -324; // verified by -Number.MIN_VALUE\nvar MAGNITUDE_DIGITS = 3; // ditto\nvar SEP = ''; // set to '_' for easier debugging\n\nfunction collate(a, b) {\n\n if (a === b) {\n return 0;\n }\n\n a = normalizeKey(a);\n b = normalizeKey(b);\n\n var ai = collationIndex(a);\n var bi = collationIndex(b);\n if ((ai - bi) !== 0) {\n return ai - bi;\n }\n switch (typeof a) {\n case 'number':\n return a - b;\n case 'boolean':\n return a < b ? -1 : 1;\n case 'string':\n return stringCollate(a, b);\n }\n return Array.isArray(a) ? arrayCollate(a, b) : objectCollate(a, b);\n}\n\n// couch considers null/NaN/Infinity/-Infinity === undefined,\n// for the purposes of mapreduce indexes. also, dates get stringified.\nfunction normalizeKey(key) {\n switch (typeof key) {\n case 'undefined':\n return null;\n case 'number':\n if (key === Infinity || key === -Infinity || isNaN(key)) {\n return null;\n }\n return key;\n case 'object':\n var origKey = key;\n if (Array.isArray(key)) {\n var len = key.length;\n key = new Array(len);\n for (var i = 0; i < len; i++) {\n key[i] = normalizeKey(origKey[i]);\n }\n /* istanbul ignore next */\n } else if (key instanceof Date) {\n return key.toJSON();\n } else if (key !== null) { // generic object\n key = {};\n for (var k in origKey) {\n if (Object.prototype.hasOwnProperty.call(origKey, k)) {\n var val = origKey[k];\n if (typeof val !== 'undefined') {\n key[k] = normalizeKey(val);\n }\n }\n }\n }\n }\n return key;\n}\n\nfunction indexify(key) {\n if (key !== null) {\n switch (typeof key) {\n case 'boolean':\n return key ? 1 : 0;\n case 'number':\n return numToIndexableString(key);\n case 'string':\n // We've to be sure that key does not contain \\u0000\n // Do order-preserving replacements:\n // 0 -> 1, 1\n // 1 -> 1, 2\n // 2 -> 2, 2\n /* eslint-disable no-control-regex */\n return key\n .replace(/\\u0002/g, '\\u0002\\u0002')\n .replace(/\\u0001/g, '\\u0001\\u0002')\n .replace(/\\u0000/g, '\\u0001\\u0001');\n /* eslint-enable no-control-regex */\n case 'object':\n var isArray = Array.isArray(key);\n var arr = isArray ? key : Object.keys(key);\n var i = -1;\n var len = arr.length;\n var result = '';\n if (isArray) {\n while (++i < len) {\n result += toIndexableString(arr[i]);\n }\n } else {\n while (++i < len) {\n var objKey = arr[i];\n result += toIndexableString(objKey) +\n toIndexableString(key[objKey]);\n }\n }\n return result;\n }\n }\n return '';\n}\n\n// convert the given key to a string that would be appropriate\n// for lexical sorting, e.g. within a database, where the\n// sorting is the same given by the collate() function.\nfunction toIndexableString(key) {\n var zero = '\\u0000';\n key = normalizeKey(key);\n return collationIndex(key) + SEP + indexify(key) + zero;\n}\n\nfunction parseNumber(str, i) {\n var originalIdx = i;\n var num;\n var zero = str[i] === '1';\n if (zero) {\n num = 0;\n i++;\n } else {\n var neg = str[i] === '0';\n i++;\n var numAsString = '';\n var magAsString = str.substring(i, i + MAGNITUDE_DIGITS);\n var magnitude = parseInt(magAsString, 10) + MIN_MAGNITUDE;\n /* istanbul ignore next */\n if (neg) {\n magnitude = -magnitude;\n }\n i += MAGNITUDE_DIGITS;\n while (true) {\n var ch = str[i];\n if (ch === '\\u0000') {\n break;\n } else {\n numAsString += ch;\n }\n i++;\n }\n numAsString = numAsString.split('.');\n if (numAsString.length === 1) {\n num = parseInt(numAsString, 10);\n } else {\n /* istanbul ignore next */\n num = parseFloat(numAsString[0] + '.' + numAsString[1]);\n }\n /* istanbul ignore next */\n if (neg) {\n num = num - 10;\n }\n /* istanbul ignore next */\n if (magnitude !== 0) {\n // parseFloat is more reliable than pow due to rounding errors\n // e.g. Number.MAX_VALUE would return Infinity if we did\n // num * Math.pow(10, magnitude);\n num = parseFloat(num + 'e' + magnitude);\n }\n }\n return {num, length : i - originalIdx};\n}\n\n// move up the stack while parsing\n// this function moved outside of parseIndexableString for performance\nfunction pop(stack, metaStack) {\n var obj = stack.pop();\n\n if (metaStack.length) {\n var lastMetaElement = metaStack[metaStack.length - 1];\n if (obj === lastMetaElement.element) {\n // popping a meta-element, e.g. an object whose value is another object\n metaStack.pop();\n lastMetaElement = metaStack[metaStack.length - 1];\n }\n var element = lastMetaElement.element;\n var lastElementIndex = lastMetaElement.index;\n if (Array.isArray(element)) {\n element.push(obj);\n } else if (lastElementIndex === stack.length - 2) { // obj with key+value\n var key = stack.pop();\n element[key] = obj;\n } else {\n stack.push(obj); // obj with key only\n }\n }\n}\n\nfunction parseIndexableString(str) {\n var stack = [];\n var metaStack = []; // stack for arrays and objects\n var i = 0;\n\n /*eslint no-constant-condition: [\"error\", { \"checkLoops\": false }]*/\n while (true) {\n var collationIndex = str[i++];\n if (collationIndex === '\\u0000') {\n if (stack.length === 1) {\n return stack.pop();\n } else {\n pop(stack, metaStack);\n continue;\n }\n }\n switch (collationIndex) {\n case '1':\n stack.push(null);\n break;\n case '2':\n stack.push(str[i] === '1');\n i++;\n break;\n case '3':\n var parsedNum = parseNumber(str, i);\n stack.push(parsedNum.num);\n i += parsedNum.length;\n break;\n case '4':\n var parsedStr = '';\n /*eslint no-constant-condition: [\"error\", { \"checkLoops\": false }]*/\n while (true) {\n var ch = str[i];\n if (ch === '\\u0000') {\n break;\n }\n parsedStr += ch;\n i++;\n }\n // perform the reverse of the order-preserving replacement\n // algorithm (see above)\n /* eslint-disable no-control-regex */\n parsedStr = parsedStr.replace(/\\u0001\\u0001/g, '\\u0000')\n .replace(/\\u0001\\u0002/g, '\\u0001')\n .replace(/\\u0002\\u0002/g, '\\u0002');\n /* eslint-enable no-control-regex */\n stack.push(parsedStr);\n break;\n case '5':\n var arrayElement = { element: [], index: stack.length };\n stack.push(arrayElement.element);\n metaStack.push(arrayElement);\n break;\n case '6':\n var objElement = { element: {}, index: stack.length };\n stack.push(objElement.element);\n metaStack.push(objElement);\n break;\n /* istanbul ignore next */\n default:\n throw new Error(\n 'bad collationIndex or unexpectedly reached end of input: ' +\n collationIndex);\n }\n }\n}\n\nfunction arrayCollate(a, b) {\n var len = Math.min(a.length, b.length);\n for (var i = 0; i < len; i++) {\n var sort = collate(a[i], b[i]);\n if (sort !== 0) {\n return sort;\n }\n }\n return (a.length === b.length) ? 0 :\n (a.length > b.length) ? 1 : -1;\n}\nfunction stringCollate(a, b) {\n // See: https://github.com/daleharvey/pouchdb/issues/40\n // This is incompatible with the CouchDB implementation, but its the\n // best we can do for now\n return (a === b) ? 0 : ((a > b) ? 1 : -1);\n}\nfunction objectCollate(a, b) {\n var ak = Object.keys(a), bk = Object.keys(b);\n var len = Math.min(ak.length, bk.length);\n for (var i = 0; i < len; i++) {\n // First sort the keys\n var sort = collate(ak[i], bk[i]);\n if (sort !== 0) {\n return sort;\n }\n // if the keys are equal sort the values\n sort = collate(a[ak[i]], b[bk[i]]);\n if (sort !== 0) {\n return sort;\n }\n\n }\n return (ak.length === bk.length) ? 0 :\n (ak.length > bk.length) ? 1 : -1;\n}\n// The collation is defined by erlangs ordered terms\n// the atoms null, true, false come first, then numbers, strings,\n// arrays, then objects\n// null/undefined/NaN/Infinity/-Infinity are all considered null\nfunction collationIndex(x) {\n var id = ['boolean', 'number', 'string', 'object'];\n var idx = id.indexOf(typeof x);\n //false if -1 otherwise true, but fast!!!!1\n if (~idx) {\n if (x === null) {\n return 1;\n }\n if (Array.isArray(x)) {\n return 5;\n }\n return idx < 3 ? (idx + 2) : (idx + 3);\n }\n /* istanbul ignore next */\n if (Array.isArray(x)) {\n return 5;\n }\n}\n\n// conversion:\n// x yyy zz...zz\n// x = 0 for negative, 1 for 0, 2 for positive\n// y = exponent (for negative numbers negated) moved so that it's >= 0\n// z = mantisse\nfunction numToIndexableString(num) {\n\n if (num === 0) {\n return '1';\n }\n\n // convert number to exponential format for easier and\n // more succinct string sorting\n var expFormat = num.toExponential().split(/e\\+?/);\n var magnitude = parseInt(expFormat[1], 10);\n\n var neg = num < 0;\n\n var result = neg ? '0' : '2';\n\n // first sort by magnitude\n // it's easier if all magnitudes are positive\n var magForComparison = ((neg ? -magnitude : magnitude) - MIN_MAGNITUDE);\n var magString = padLeft((magForComparison).toString(), '0', MAGNITUDE_DIGITS);\n\n result += SEP + magString;\n\n // then sort by the factor\n var factor = Math.abs(parseFloat(expFormat[0])); // [1..10)\n /* istanbul ignore next */\n if (neg) { // for negative reverse ordering\n factor = 10 - factor;\n }\n\n var factorStr = factor.toFixed(20);\n\n // strip zeros from the end\n factorStr = factorStr.replace(/\\.?0+$/, '');\n\n result += SEP + factorStr;\n\n return result;\n}\n\n// create a comparator based on the sort object\nfunction createFieldSorter(sort) {\n\n function getFieldValuesAsArray(doc) {\n return sort.map(function (sorting) {\n var fieldName = getKey(sorting);\n var parsedField = parseField(fieldName);\n var docFieldValue = getFieldFromDoc(doc, parsedField);\n return docFieldValue;\n });\n }\n\n return function (aRow, bRow) {\n var aFieldValues = getFieldValuesAsArray(aRow.doc);\n var bFieldValues = getFieldValuesAsArray(bRow.doc);\n var collation = collate(aFieldValues, bFieldValues);\n if (collation !== 0) {\n return collation;\n }\n // this is what mango seems to do\n return compare(aRow.doc._id, bRow.doc._id);\n };\n}\n\nfunction filterInMemoryFields(rows, requestDef, inMemoryFields) {\n rows = rows.filter(function (row) {\n return rowFilter(row.doc, requestDef.selector, inMemoryFields);\n });\n\n if (requestDef.sort) {\n // in-memory sort\n var fieldSorter = createFieldSorter(requestDef.sort);\n rows = rows.sort(fieldSorter);\n if (typeof requestDef.sort[0] !== 'string' &&\n getValue(requestDef.sort[0]) === 'desc') {\n rows = rows.reverse();\n }\n }\n\n if ('limit' in requestDef || 'skip' in requestDef) {\n // have to do the limit in-memory\n var skip = requestDef.skip || 0;\n var limit = ('limit' in requestDef ? requestDef.limit : rows.length) + skip;\n rows = rows.slice(skip, limit);\n }\n return rows;\n}\n\nfunction rowFilter(doc, selector, inMemoryFields) {\n return inMemoryFields.every(function (field) {\n var matcher = selector[field];\n var parsedField = parseField(field);\n var docFieldValue = getFieldFromDoc(doc, parsedField);\n if (isCombinationalField(field)) {\n return matchCominationalSelector(field, matcher, doc);\n }\n\n return matchSelector(matcher, doc, parsedField, docFieldValue);\n });\n}\n\nfunction matchSelector(matcher, doc, parsedField, docFieldValue) {\n if (!matcher) {\n // no filtering necessary; this field is just needed for sorting\n return true;\n }\n\n // is matcher an object, if so continue recursion\n if (typeof matcher === 'object') {\n return Object.keys(matcher).every(function (maybeUserOperator) {\n var userValue = matcher[ maybeUserOperator ];\n // explicit operator\n if (maybeUserOperator.indexOf(\"$\") === 0) {\n return match(maybeUserOperator, doc, userValue, parsedField, docFieldValue);\n } else {\n var subParsedField = parseField(maybeUserOperator);\n\n if (\n docFieldValue === undefined &&\n typeof userValue !== \"object\" &&\n subParsedField.length > 0\n ) {\n // the field does not exist, return or getFieldFromDoc will throw\n return false;\n }\n\n var subDocFieldValue = getFieldFromDoc(docFieldValue, subParsedField);\n\n if (typeof userValue === \"object\") {\n // field value is an object that might contain more operators\n return matchSelector(userValue, doc, parsedField, subDocFieldValue);\n }\n\n // implicit operator\n return match(\"$eq\", doc, userValue, subParsedField, subDocFieldValue);\n }\n });\n }\n\n // no more depth, No need to recurse further\n return matcher === docFieldValue;\n}\n\nfunction matchCominationalSelector(field, matcher, doc) {\n\n if (field === '$or') {\n return matcher.some(function (orMatchers) {\n return rowFilter(doc, orMatchers, Object.keys(orMatchers));\n });\n }\n\n if (field === '$not') {\n return !rowFilter(doc, matcher, Object.keys(matcher));\n }\n\n //`$nor`\n return !matcher.find(function (orMatchers) {\n return rowFilter(doc, orMatchers, Object.keys(orMatchers));\n });\n\n}\n\nfunction match(userOperator, doc, userValue, parsedField, docFieldValue) {\n if (!matchers[userOperator]) {\n /* istanbul ignore next */\n throw new Error('unknown operator \"' + userOperator +\n '\" - should be one of $eq, $lte, $lt, $gt, $gte, $exists, $ne, $in, ' +\n '$nin, $size, $mod, $regex, $elemMatch, $type, $allMatch or $all');\n }\n return matchers[userOperator](doc, userValue, parsedField, docFieldValue);\n}\n\nfunction fieldExists(docFieldValue) {\n return typeof docFieldValue !== 'undefined' && docFieldValue !== null;\n}\n\nfunction fieldIsNotUndefined(docFieldValue) {\n return typeof docFieldValue !== 'undefined';\n}\n\nfunction modField(docFieldValue, userValue) {\n if (typeof docFieldValue !== \"number\" ||\n parseInt(docFieldValue, 10) !== docFieldValue) {\n return false;\n }\n\n var divisor = userValue[0];\n var mod = userValue[1];\n\n return docFieldValue % divisor === mod;\n}\n\nfunction arrayContainsValue(docFieldValue, userValue) {\n return userValue.some(function (val) {\n if (docFieldValue instanceof Array) {\n return docFieldValue.some(function (docFieldValueItem) {\n return collate(val, docFieldValueItem) === 0;\n });\n }\n\n return collate(val, docFieldValue) === 0;\n });\n}\n\nfunction arrayContainsAllValues(docFieldValue, userValue) {\n return userValue.every(function (val) {\n return docFieldValue.some(function (docFieldValueItem) {\n return collate(val, docFieldValueItem) === 0;\n });\n });\n}\n\nfunction arraySize(docFieldValue, userValue) {\n return docFieldValue.length === userValue;\n}\n\nfunction regexMatch(docFieldValue, userValue) {\n var re = new RegExp(userValue);\n\n return re.test(docFieldValue);\n}\n\nfunction typeMatch(docFieldValue, userValue) {\n\n switch (userValue) {\n case 'null':\n return docFieldValue === null;\n case 'boolean':\n return typeof (docFieldValue) === 'boolean';\n case 'number':\n return typeof (docFieldValue) === 'number';\n case 'string':\n return typeof (docFieldValue) === 'string';\n case 'array':\n return docFieldValue instanceof Array;\n case 'object':\n return ({}).toString.call(docFieldValue) === '[object Object]';\n }\n}\n\nvar matchers = {\n\n '$elemMatch': function (doc, userValue, parsedField, docFieldValue) {\n if (!Array.isArray(docFieldValue)) {\n return false;\n }\n\n if (docFieldValue.length === 0) {\n return false;\n }\n\n if (typeof docFieldValue[0] === 'object' && docFieldValue[0] !== null) {\n return docFieldValue.some(function (val) {\n return rowFilter(val, userValue, Object.keys(userValue));\n });\n }\n\n return docFieldValue.some(function (val) {\n return matchSelector(userValue, doc, parsedField, val);\n });\n },\n\n '$allMatch': function (doc, userValue, parsedField, docFieldValue) {\n if (!Array.isArray(docFieldValue)) {\n return false;\n }\n\n /* istanbul ignore next */\n if (docFieldValue.length === 0) {\n return false;\n }\n\n if (typeof docFieldValue[0] === 'object' && docFieldValue[0] !== null) {\n return docFieldValue.every(function (val) {\n return rowFilter(val, userValue, Object.keys(userValue));\n });\n }\n\n return docFieldValue.every(function (val) {\n return matchSelector(userValue, doc, parsedField, val);\n });\n },\n\n '$eq': function (doc, userValue, parsedField, docFieldValue) {\n return fieldIsNotUndefined(docFieldValue) && collate(docFieldValue, userValue) === 0;\n },\n\n '$gte': function (doc, userValue, parsedField, docFieldValue) {\n return fieldIsNotUndefined(docFieldValue) && collate(docFieldValue, userValue) >= 0;\n },\n\n '$gt': function (doc, userValue, parsedField, docFieldValue) {\n return fieldIsNotUndefined(docFieldValue) && collate(docFieldValue, userValue) > 0;\n },\n\n '$lte': function (doc, userValue, parsedField, docFieldValue) {\n return fieldIsNotUndefined(docFieldValue) && collate(docFieldValue, userValue) <= 0;\n },\n\n '$lt': function (doc, userValue, parsedField, docFieldValue) {\n return fieldIsNotUndefined(docFieldValue) && collate(docFieldValue, userValue) < 0;\n },\n\n '$exists': function (doc, userValue, parsedField, docFieldValue) {\n //a field that is null is still considered to exist\n if (userValue) {\n return fieldIsNotUndefined(docFieldValue);\n }\n\n return !fieldIsNotUndefined(docFieldValue);\n },\n\n '$mod': function (doc, userValue, parsedField, docFieldValue) {\n return fieldExists(docFieldValue) && modField(docFieldValue, userValue);\n },\n\n '$ne': function (doc, userValue, parsedField, docFieldValue) {\n return userValue.every(function (neValue) {\n return collate(docFieldValue, neValue) !== 0;\n });\n },\n '$in': function (doc, userValue, parsedField, docFieldValue) {\n return fieldExists(docFieldValue) && arrayContainsValue(docFieldValue, userValue);\n },\n\n '$nin': function (doc, userValue, parsedField, docFieldValue) {\n return fieldExists(docFieldValue) && !arrayContainsValue(docFieldValue, userValue);\n },\n\n '$size': function (doc, userValue, parsedField, docFieldValue) {\n return fieldExists(docFieldValue) &&\n Array.isArray(docFieldValue) &&\n arraySize(docFieldValue, userValue);\n },\n\n '$all': function (doc, userValue, parsedField, docFieldValue) {\n return Array.isArray(docFieldValue) && arrayContainsAllValues(docFieldValue, userValue);\n },\n\n '$regex': function (doc, userValue, parsedField, docFieldValue) {\n return fieldExists(docFieldValue) &&\n typeof docFieldValue == \"string\" &&\n userValue.every(function (regexValue) {\n return regexMatch(docFieldValue, regexValue);\n });\n },\n\n '$type': function (doc, userValue, parsedField, docFieldValue) {\n return typeMatch(docFieldValue, userValue);\n }\n};\n\n// return true if the given doc matches the supplied selector\nfunction matchesSelector(doc, selector) {\n /* istanbul ignore if */\n if (typeof selector !== 'object') {\n // match the CouchDB error message\n throw new Error('Selector error: expected a JSON object');\n }\n\n selector = massageSelector(selector);\n var row = {\n doc\n };\n\n var rowsMatched = filterInMemoryFields([row], { selector }, Object.keys(selector));\n return rowsMatched && rowsMatched.length === 1;\n}\n\nfunction evalFilter(input) {\n return scopeEval('\"use strict\";\\nreturn ' + input + ';', {});\n}\n\nfunction evalView(input) {\n var code = [\n 'return function(doc) {',\n ' \"use strict\";',\n ' var emitted = false;',\n ' var emit = function (a, b) {',\n ' emitted = true;',\n ' };',\n ' var view = ' + input + ';',\n ' view(doc);',\n ' if (emitted) {',\n ' return true;',\n ' }',\n '};'\n ].join('\\n');\n\n return scopeEval(code, {});\n}\n\nfunction validate(opts, callback) {\n if (opts.selector) {\n if (opts.filter && opts.filter !== '_selector') {\n var filterName = typeof opts.filter === 'string' ?\n opts.filter : 'function';\n return callback(new Error('selector invalid for filter \"' + filterName + '\"'));\n }\n }\n callback();\n}\n\nfunction normalize(opts) {\n if (opts.view && !opts.filter) {\n opts.filter = '_view';\n }\n\n if (opts.selector && !opts.filter) {\n opts.filter = '_selector';\n }\n\n if (opts.filter && typeof opts.filter === 'string') {\n if (opts.filter === '_view') {\n opts.view = normalizeDesignDocFunctionName(opts.view);\n } else {\n opts.filter = normalizeDesignDocFunctionName(opts.filter);\n }\n }\n}\n\nfunction shouldFilter(changesHandler, opts) {\n return opts.filter && typeof opts.filter === 'string' &&\n !opts.doc_ids && !isRemote(changesHandler.db);\n}\n\nfunction filter(changesHandler, opts) {\n var callback = opts.complete;\n if (opts.filter === '_view') {\n if (!opts.view || typeof opts.view !== 'string') {\n var err = createError(BAD_REQUEST,\n '`view` filter parameter not found or invalid.');\n return callback(err);\n }\n // fetch a view from a design doc, make it behave like a filter\n var viewName = parseDesignDocFunctionName(opts.view);\n changesHandler.db.get('_design/' + viewName[0], function (err, ddoc) {\n /* istanbul ignore if */\n if (changesHandler.isCancelled) {\n return callback(null, {status: 'cancelled'});\n }\n /* istanbul ignore next */\n if (err) {\n return callback(generateErrorFromResponse(err));\n }\n var mapFun = ddoc && ddoc.views && ddoc.views[viewName[1]] &&\n ddoc.views[viewName[1]].map;\n if (!mapFun) {\n return callback(createError(MISSING_DOC,\n (ddoc.views ? 'missing json key: ' + viewName[1] :\n 'missing json key: views')));\n }\n opts.filter = evalView(mapFun);\n changesHandler.doChanges(opts);\n });\n } else if (opts.selector) {\n opts.filter = function (doc) {\n return matchesSelector(doc, opts.selector);\n };\n changesHandler.doChanges(opts);\n } else {\n // fetch a filter from a design doc\n var filterName = parseDesignDocFunctionName(opts.filter);\n changesHandler.db.get('_design/' + filterName[0], function (err, ddoc) {\n /* istanbul ignore if */\n if (changesHandler.isCancelled) {\n return callback(null, {status: 'cancelled'});\n }\n /* istanbul ignore next */\n if (err) {\n return callback(generateErrorFromResponse(err));\n }\n var filterFun = ddoc && ddoc.filters && ddoc.filters[filterName[1]];\n if (!filterFun) {\n return callback(createError(MISSING_DOC,\n ((ddoc && ddoc.filters) ? 'missing json key: ' + filterName[1]\n : 'missing json key: filters')));\n }\n opts.filter = evalFilter(filterFun);\n changesHandler.doChanges(opts);\n });\n }\n}\n\nfunction applyChangesFilterPlugin(PouchDB) {\n PouchDB._changesFilterPlugin = {\n validate,\n normalize,\n shouldFilter,\n filter\n };\n}\n\n// TODO: remove from pouchdb-core (breaking)\nPouchDB.plugin(applyChangesFilterPlugin);\n\nPouchDB.version = version;\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$$1 = createBlob(['']);\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$$1);\n req = txn.objectStore(store).put(doc);\n } else {\n const docId = docIdOrCreateDoc;\n req = txn.objectStore(store).put(blob$$1, 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$$1) {\n if (!/^\\d+-/.test(rev$$1)) {\n return createError(INVALID_REV);\n }\n var idx = rev$$1.indexOf('-');\n var left = rev$$1.substring(0, idx);\n var right = rev$$1.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 = uuid();\n }\n newRevId = 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 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 = createError(DOC_VALIDATION, key);\n error.message = 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 thisAtob(data);\n } catch (e) {\n var err = createError(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 = binStringToBluffer(asBinary, att.content_type);\n } else if (blobType === 'base64') {\n att.data = thisBtoa(asBinary);\n } else { // binary\n att.data = asBinary;\n }\n binaryMd5(asBinary, function (result) {\n att.digest = 'md5-' + result;\n callback();\n });\n}\n\nfunction preprocessBlob(att, blobType, callback) {\n 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 blobToBinaryString(att.data, function (binString) {\n att.data = binString;\n callback();\n });\n } else if (blobType === 'base64') {\n blobToBase64(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 (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 || winningRev(prev);\n var previouslyDeleted = 'deleted' in prev ? prev.deleted :\n isDeleted(prev, previousWinningRev);\n var deleted = 'deleted' in docInfo.metadata ? docInfo.metadata.deleted :\n 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 = 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 = createError(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$$1 = winningRev(docInfo.metadata);\n var winningRevIsDeleted = isDeleted(docInfo.metadata, winningRev$$1);\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$$1) {\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 = isDeleted(docInfo.metadata, newRev);\n }\n\n writeDoc(docInfo, winningRev$$1, 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$$1 = winningRev(docInfo.metadata);\n var deleted = isDeleted(docInfo.metadata, winningRev$$1);\n if ('was_delete' in opts && deleted) {\n results[resultsIdx] = createError(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 = createError(REV_CONFLICT);\n results[resultsIdx] = err;\n return callback();\n }\n\n var delta = deleted ? 0 : 1;\n\n writeDoc(docInfo, winningRev$$1, 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 && 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 = 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\n// IndexedDB requires a versioned database structure, so we use the\n// version here to manage migrations.\nvar ADAPTER_VERSION = 5;\n\n// The object stores created for each database\n// DOC_STORE stores the document meta data, its revision history and state\n// Keyed by document id\nvar DOC_STORE = 'document-store';\n// BY_SEQ_STORE stores a particular version of a document, keyed by its\n// sequence id\nvar BY_SEQ_STORE = 'by-sequence';\n// Where we store attachments\nvar ATTACH_STORE = 'attach-store';\n// Where we store many-to-many relations\n// between attachment digests and seqs\nvar ATTACH_AND_SEQ_STORE = 'attach-seq-store';\n\n// Where we store database-wide meta data in a single record\n// keyed by id: META_STORE\nvar META_STORE = 'meta-store';\n// Where we store local documents\nvar LOCAL_STORE = 'local-store';\n// Where we detect blob support\nvar DETECT_BLOB_SUPPORT_STORE = 'detect-blob-support';\n\nfunction safeJsonParse(str) {\n // This try/catch guards against stack overflow errors.\n // JSON.parse() is faster than vuvuzela.parse() but vuvuzela\n // cannot overflow.\n try {\n return JSON.parse(str);\n } catch (e) {\n /* istanbul ignore next */\n return vuvuzela.parse(str);\n }\n}\n\nfunction safeJsonStringify(json) {\n try {\n return JSON.stringify(json);\n } catch (e) {\n /* istanbul ignore next */\n return vuvuzela.stringify(json);\n }\n}\n\nfunction idbError(callback) {\n return function (evt) {\n var message = 'unknown_error';\n if (evt.target && evt.target.error) {\n message = evt.target.error.name || evt.target.error.message;\n }\n callback(createError(IDB_ERROR, message, evt.type));\n };\n}\n\n// Unfortunately, the metadata has to be stringified\n// when it is put into the database, because otherwise\n// IndexedDB can throw errors for deeply-nested objects.\n// Originally we just used JSON.parse/JSON.stringify; now\n// we use this custom vuvuzela library that avoids recursion.\n// If we could do it all over again, we'd probably use a\n// format for the revision trees other than JSON.\nfunction encodeMetadata(metadata, winningRev, deleted) {\n return {\n data: safeJsonStringify(metadata),\n winningRev,\n deletedOrLocal: deleted ? '1' : '0',\n seq: metadata.seq, // highest seq for this doc\n id: metadata.id\n };\n}\n\nfunction decodeMetadata(storedObject) {\n if (!storedObject) {\n return null;\n }\n var metadata = safeJsonParse(storedObject.data);\n metadata.winningRev = storedObject.winningRev;\n metadata.deleted = storedObject.deletedOrLocal === '1';\n metadata.seq = storedObject.seq;\n return metadata;\n}\n\n// read the doc back out from the database. we don't store the\n// _id or _rev because we already have _doc_id_rev.\nfunction decodeDoc(doc) {\n if (!doc) {\n return doc;\n }\n var idx = doc._doc_id_rev.lastIndexOf(':');\n doc._id = doc._doc_id_rev.substring(0, idx - 1);\n doc._rev = doc._doc_id_rev.substring(idx + 1);\n delete doc._doc_id_rev;\n return doc;\n}\n\n// Read a blob from the database, encoding as necessary\n// and translating from base64 if the IDB doesn't support\n// native Blobs\nfunction readBlobData(body, type, asBlob, callback) {\n if (asBlob) {\n if (!body) {\n callback(createBlob([''], {type}));\n } else if (typeof body !== 'string') { // we have blob support\n callback(body);\n } else { // no blob support\n callback(b64ToBluffer(body, type));\n }\n } else { // as base64 string\n if (!body) {\n callback('');\n } else if (typeof body !== 'string') { // we have blob support\n readAsBinaryString(body, function (binary) {\n callback(thisBtoa(binary));\n });\n } else { // no blob support\n callback(body);\n }\n }\n}\n\nfunction fetchAttachmentsIfNecessary(doc, opts, txn, cb) {\n var attachments = Object.keys(doc._attachments || {});\n if (!attachments.length) {\n return cb && cb();\n }\n var numDone = 0;\n\n function checkDone() {\n if (++numDone === attachments.length && cb) {\n cb();\n }\n }\n\n function fetchAttachment(doc, att) {\n var attObj = doc._attachments[att];\n var digest = attObj.digest;\n var req = txn.objectStore(ATTACH_STORE).get(digest);\n req.onsuccess = function (e) {\n attObj.body = e.target.result.body;\n checkDone();\n };\n }\n\n attachments.forEach(function (att) {\n if (opts.attachments && opts.include_docs) {\n fetchAttachment(doc, att);\n } else {\n doc._attachments[att].stub = true;\n checkDone();\n }\n });\n}\n\n// IDB-specific postprocessing necessary because\n// we don't know whether we stored a true Blob or\n// a base64-encoded string, and if it's a Blob it\n// needs to be read outside of the transaction context\nfunction postProcessAttachments(results, asBlob) {\n return Promise.all(results.map(function (row) {\n if (row.doc && row.doc._attachments) {\n var attNames = Object.keys(row.doc._attachments);\n return Promise.all(attNames.map(function (att) {\n var attObj = row.doc._attachments[att];\n if (!('body' in attObj)) { // already processed\n return;\n }\n var body = attObj.body;\n var type = attObj.content_type;\n return new Promise(function (resolve) {\n readBlobData(body, type, asBlob, function (data) {\n row.doc._attachments[att] = Object.assign(\n pick(attObj, ['digest', 'content_type']),\n {data}\n );\n resolve();\n });\n });\n }));\n }\n }));\n}\n\nfunction compactRevs(revs, docId, txn) {\n\n var possiblyOrphanedDigests = [];\n var seqStore = txn.objectStore(BY_SEQ_STORE);\n var attStore = txn.objectStore(ATTACH_STORE);\n var attAndSeqStore = txn.objectStore(ATTACH_AND_SEQ_STORE);\n var count = revs.length;\n\n function checkDone() {\n count--;\n if (!count) { // done processing all revs\n deleteOrphanedAttachments();\n }\n }\n\n function deleteOrphanedAttachments() {\n if (!possiblyOrphanedDigests.length) {\n return;\n }\n possiblyOrphanedDigests.forEach(function (digest) {\n var countReq = attAndSeqStore.index('digestSeq').count(\n IDBKeyRange.bound(\n digest + '::', digest + '::\\uffff', false, false));\n countReq.onsuccess = function (e) {\n var count = e.target.result;\n if (!count) {\n // orphaned\n attStore.delete(digest);\n }\n };\n });\n }\n\n revs.forEach(function (rev$$1) {\n var index = seqStore.index('_doc_id_rev');\n var key = docId + \"::\" + rev$$1;\n index.getKey(key).onsuccess = function (e) {\n var seq = e.target.result;\n if (typeof seq !== 'number') {\n return checkDone();\n }\n seqStore.delete(seq);\n\n var cursor = attAndSeqStore.index('seq')\n .openCursor(IDBKeyRange.only(seq));\n\n cursor.onsuccess = function (event) {\n var cursor = event.target.result;\n if (cursor) {\n var digest = cursor.value.digestSeq.split('::')[0];\n possiblyOrphanedDigests.push(digest);\n attAndSeqStore.delete(cursor.primaryKey);\n cursor.continue();\n } else { // done\n checkDone();\n }\n };\n };\n });\n}\n\nfunction openTransactionSafely(idb, stores, mode) {\n try {\n return {\n txn: idb.transaction(stores, mode)\n };\n } catch (err) {\n return {\n error: err\n };\n }\n}\n\nvar changesHandler = new Changes();\n\nfunction idbBulkDocs(dbOpts, req, opts, api, idb, callback) {\n var docInfos = req.docs;\n var txn;\n var docStore;\n var bySeqStore;\n var attachStore;\n var attachAndSeqStore;\n var metaStore;\n var docInfoError;\n var metaDoc;\n\n for (var i = 0, len = docInfos.length; i < len; i++) {\n var doc = docInfos[i];\n if (doc._id && isLocalId(doc._id)) {\n continue;\n }\n doc = docInfos[i] = parseDoc(doc, opts.new_edits, dbOpts);\n if (doc.error && !docInfoError) {\n docInfoError = doc;\n }\n }\n\n if (docInfoError) {\n return callback(docInfoError);\n }\n\n var allDocsProcessed = false;\n var docCountDelta = 0;\n var results = new Array(docInfos.length);\n var fetchedDocs = new Map();\n var preconditionErrored = false;\n var blobType = api._meta.blobSupport ? 'blob' : 'base64';\n\n preprocessAttachments(docInfos, blobType, function (err) {\n if (err) {\n return callback(err);\n }\n startTransaction();\n });\n\n function startTransaction() {\n\n var stores = [\n DOC_STORE, BY_SEQ_STORE,\n ATTACH_STORE,\n LOCAL_STORE, ATTACH_AND_SEQ_STORE,\n META_STORE\n ];\n var txnResult = openTransactionSafely(idb, stores, 'readwrite');\n if (txnResult.error) {\n return callback(txnResult.error);\n }\n txn = txnResult.txn;\n txn.onabort = idbError(callback);\n txn.ontimeout = idbError(callback);\n txn.oncomplete = complete;\n docStore = txn.objectStore(DOC_STORE);\n bySeqStore = txn.objectStore(BY_SEQ_STORE);\n attachStore = txn.objectStore(ATTACH_STORE);\n attachAndSeqStore = txn.objectStore(ATTACH_AND_SEQ_STORE);\n metaStore = txn.objectStore(META_STORE);\n\n metaStore.get(META_STORE).onsuccess = function (e) {\n metaDoc = e.target.result;\n updateDocCountIfReady();\n };\n\n verifyAttachments(function (err) {\n if (err) {\n preconditionErrored = true;\n return callback(err);\n }\n fetchExistingDocs();\n });\n }\n\n function onAllDocsProcessed() {\n allDocsProcessed = true;\n updateDocCountIfReady();\n }\n\n function idbProcessDocs() {\n processDocs(dbOpts.revs_limit, docInfos, api, fetchedDocs,\n txn, results, writeDoc, opts, onAllDocsProcessed);\n }\n\n function updateDocCountIfReady() {\n if (!metaDoc || !allDocsProcessed) {\n return;\n }\n // caching the docCount saves a lot of time in allDocs() and\n // info(), which is why we go to all the trouble of doing this\n metaDoc.docCount += docCountDelta;\n metaStore.put(metaDoc);\n }\n\n function fetchExistingDocs() {\n\n if (!docInfos.length) {\n return;\n }\n\n var numFetched = 0;\n\n function checkDone() {\n if (++numFetched === docInfos.length) {\n idbProcessDocs();\n }\n }\n\n function readMetadata(event) {\n var metadata = decodeMetadata(event.target.result);\n\n if (metadata) {\n fetchedDocs.set(metadata.id, metadata);\n }\n checkDone();\n }\n\n for (var i = 0, len = docInfos.length; i < len; i++) {\n var docInfo = docInfos[i];\n if (docInfo._id && isLocalId(docInfo._id)) {\n checkDone(); // skip local docs\n continue;\n }\n var req = docStore.get(docInfo.metadata.id);\n req.onsuccess = readMetadata;\n }\n }\n\n function complete() {\n if (preconditionErrored) {\n return;\n }\n\n changesHandler.notify(api._meta.name);\n callback(null, results);\n }\n\n function verifyAttachment(digest, callback) {\n\n var req = attachStore.get(digest);\n req.onsuccess = function (e) {\n if (!e.target.result) {\n var err = createError(MISSING_STUB,\n 'unknown stub attachment with digest ' +\n digest);\n err.status = 412;\n callback(err);\n } else {\n callback();\n }\n };\n }\n\n function verifyAttachments(finish) {\n\n\n var digests = [];\n docInfos.forEach(function (docInfo) {\n if (docInfo.data && docInfo.data._attachments) {\n Object.keys(docInfo.data._attachments).forEach(function (filename) {\n var att = docInfo.data._attachments[filename];\n if (att.stub) {\n digests.push(att.digest);\n }\n });\n }\n });\n if (!digests.length) {\n return finish();\n }\n var numDone = 0;\n var err;\n\n function checkDone() {\n if (++numDone === digests.length) {\n finish(err);\n }\n }\n digests.forEach(function (digest) {\n verifyAttachment(digest, function (attErr) {\n if (attErr && !err) {\n err = attErr;\n }\n checkDone();\n });\n });\n }\n\n function writeDoc(docInfo, winningRev$$1, winningRevIsDeleted, newRevIsDeleted,\n isUpdate, delta, resultsIdx, callback) {\n\n docInfo.metadata.winningRev = winningRev$$1;\n docInfo.metadata.deleted = winningRevIsDeleted;\n\n var doc = docInfo.data;\n doc._id = docInfo.metadata.id;\n doc._rev = docInfo.metadata.rev;\n\n if (newRevIsDeleted) {\n doc._deleted = true;\n }\n\n var hasAttachments = doc._attachments &&\n Object.keys(doc._attachments).length;\n if (hasAttachments) {\n return writeAttachments(docInfo, winningRev$$1, winningRevIsDeleted,\n isUpdate, resultsIdx, callback);\n }\n\n docCountDelta += delta;\n updateDocCountIfReady();\n\n finishDoc(docInfo, winningRev$$1, winningRevIsDeleted,\n isUpdate, resultsIdx, callback);\n }\n\n function finishDoc(docInfo, winningRev$$1, winningRevIsDeleted,\n isUpdate, resultsIdx, callback) {\n\n var doc = docInfo.data;\n var metadata = docInfo.metadata;\n\n doc._doc_id_rev = metadata.id + '::' + metadata.rev;\n delete doc._id;\n delete doc._rev;\n\n function afterPutDoc(e) {\n var revsToDelete = docInfo.stemmedRevs || [];\n\n if (isUpdate && api.auto_compaction) {\n revsToDelete = revsToDelete.concat(compactTree(docInfo.metadata));\n }\n\n if (revsToDelete && revsToDelete.length) {\n compactRevs(revsToDelete, docInfo.metadata.id, txn);\n }\n\n metadata.seq = e.target.result;\n // Current _rev is calculated from _rev_tree on read\n // delete metadata.rev;\n var metadataToStore = encodeMetadata(metadata, winningRev$$1,\n winningRevIsDeleted);\n var metaDataReq = docStore.put(metadataToStore);\n metaDataReq.onsuccess = afterPutMetadata;\n }\n\n function afterPutDocError(e) {\n // ConstraintError, need to update, not put (see #1638 for details)\n e.preventDefault(); // avoid transaction abort\n e.stopPropagation(); // avoid transaction onerror\n var index = bySeqStore.index('_doc_id_rev');\n var getKeyReq = index.getKey(doc._doc_id_rev);\n getKeyReq.onsuccess = function (e) {\n var putReq = bySeqStore.put(doc, e.target.result);\n putReq.onsuccess = afterPutDoc;\n };\n }\n\n function afterPutMetadata() {\n results[resultsIdx] = {\n ok: true,\n id: metadata.id,\n rev: metadata.rev\n };\n fetchedDocs.set(docInfo.metadata.id, docInfo.metadata);\n insertAttachmentMappings(docInfo, metadata.seq, callback);\n }\n\n var putReq = bySeqStore.put(doc);\n\n putReq.onsuccess = afterPutDoc;\n putReq.onerror = afterPutDocError;\n }\n\n function writeAttachments(docInfo, winningRev$$1, winningRevIsDeleted,\n isUpdate, resultsIdx, callback) {\n\n\n var doc = docInfo.data;\n\n var numDone = 0;\n var attachments = Object.keys(doc._attachments);\n\n function collectResults() {\n if (numDone === attachments.length) {\n finishDoc(docInfo, winningRev$$1, winningRevIsDeleted,\n isUpdate, resultsIdx, callback);\n }\n }\n\n function attachmentSaved() {\n numDone++;\n collectResults();\n }\n\n attachments.forEach(function (key) {\n var att = docInfo.data._attachments[key];\n if (!att.stub) {\n var data = att.data;\n delete att.data;\n att.revpos = parseInt(winningRev$$1, 10);\n var digest = att.digest;\n saveAttachment(digest, data, attachmentSaved);\n } else {\n numDone++;\n collectResults();\n }\n });\n }\n\n // map seqs to attachment digests, which\n // we will need later during compaction\n function insertAttachmentMappings(docInfo, seq, callback) {\n\n var attsAdded = 0;\n var attsToAdd = Object.keys(docInfo.data._attachments || {});\n\n if (!attsToAdd.length) {\n return callback();\n }\n\n function checkDone() {\n if (++attsAdded === attsToAdd.length) {\n callback();\n }\n }\n\n function add(att) {\n var digest = docInfo.data._attachments[att].digest;\n var req = attachAndSeqStore.put({\n seq,\n digestSeq: digest + '::' + seq\n });\n\n req.onsuccess = checkDone;\n req.onerror = function (e) {\n // this callback is for a constaint error, which we ignore\n // because this docid/rev has already been associated with\n // the digest (e.g. when new_edits == false)\n e.preventDefault(); // avoid transaction abort\n e.stopPropagation(); // avoid transaction onerror\n checkDone();\n };\n }\n for (var i = 0; i < attsToAdd.length; i++) {\n add(attsToAdd[i]); // do in parallel\n }\n }\n\n function saveAttachment(digest, data, callback) {\n\n\n var getKeyReq = attachStore.count(digest);\n getKeyReq.onsuccess = function (e) {\n var count = e.target.result;\n if (count) {\n return callback(); // already exists\n }\n var newAtt = {\n digest,\n body: data\n };\n var putReq = attachStore.put(newAtt);\n putReq.onsuccess = callback;\n };\n }\n}\n\n// Abstraction over IDBCursor and getAll()/getAllKeys() that allows us to batch our operations\n// while falling back to a normal IDBCursor operation on browsers that don't support getAll() or\n// getAllKeys(). This allows for a much faster implementation than just straight-up cursors, because\n// we're not processing each document one-at-a-time.\nfunction runBatchedCursor(objectStore, keyRange, descending, batchSize, onBatch) {\n\n if (batchSize === -1) {\n batchSize = 1000;\n }\n\n // Bail out of getAll()/getAllKeys() in the following cases:\n // 1) either method is unsupported - we need both\n // 2) batchSize is 1 (might as well use IDBCursor)\n // 3) descending – no real way to do this via getAll()/getAllKeys()\n\n var useGetAll = typeof objectStore.getAll === 'function' &&\n typeof objectStore.getAllKeys === 'function' &&\n batchSize > 1 && !descending;\n\n var keysBatch;\n var valuesBatch;\n var pseudoCursor;\n\n function onGetAll(e) {\n valuesBatch = e.target.result;\n if (keysBatch) {\n onBatch(keysBatch, valuesBatch, pseudoCursor);\n }\n }\n\n function onGetAllKeys(e) {\n keysBatch = e.target.result;\n if (valuesBatch) {\n onBatch(keysBatch, valuesBatch, pseudoCursor);\n }\n }\n\n function continuePseudoCursor() {\n if (!keysBatch.length) { // no more results\n return onBatch();\n }\n // fetch next batch, exclusive start\n var lastKey = keysBatch[keysBatch.length - 1];\n var newKeyRange;\n if (keyRange && keyRange.upper) {\n try {\n newKeyRange = IDBKeyRange.bound(lastKey, keyRange.upper,\n true, keyRange.upperOpen);\n } catch (e) {\n if (e.name === \"DataError\" && e.code === 0) {\n return onBatch(); // we're done, startkey and endkey are equal\n }\n }\n } else {\n newKeyRange = IDBKeyRange.lowerBound(lastKey, true);\n }\n keyRange = newKeyRange;\n keysBatch = null;\n valuesBatch = null;\n objectStore.getAll(keyRange, batchSize).onsuccess = onGetAll;\n objectStore.getAllKeys(keyRange, batchSize).onsuccess = onGetAllKeys;\n }\n\n function onCursor(e) {\n var cursor = e.target.result;\n if (!cursor) { // done\n return onBatch();\n }\n // regular IDBCursor acts like a batch where batch size is always 1\n onBatch([cursor.key], [cursor.value], cursor);\n }\n\n if (useGetAll) {\n pseudoCursor = {\"continue\": continuePseudoCursor};\n objectStore.getAll(keyRange, batchSize).onsuccess = onGetAll;\n objectStore.getAllKeys(keyRange, batchSize).onsuccess = onGetAllKeys;\n } else if (descending) {\n objectStore.openCursor(keyRange, 'prev').onsuccess = onCursor;\n } else {\n objectStore.openCursor(keyRange).onsuccess = onCursor;\n }\n}\n\n// simple shim for objectStore.getAll(), falling back to IDBCursor\nfunction getAll(objectStore, keyRange, onSuccess) {\n if (typeof objectStore.getAll === 'function') {\n // use native getAll\n objectStore.getAll(keyRange).onsuccess = onSuccess;\n return;\n }\n // fall back to cursors\n var values = [];\n\n function onCursor(e) {\n var cursor = e.target.result;\n if (cursor) {\n values.push(cursor.value);\n cursor.continue();\n } else {\n onSuccess({\n target: {\n result: values\n }\n });\n }\n }\n\n objectStore.openCursor(keyRange).onsuccess = onCursor;\n}\n\nfunction allDocsKeys(keys, docStore, onBatch) {\n // It's not guaranteed to be returned in right order\n var valuesBatch = new Array(keys.length);\n var count = 0;\n keys.forEach(function (key, index) {\n docStore.get(key).onsuccess = function (event) {\n if (event.target.result) {\n valuesBatch[index] = event.target.result;\n } else {\n valuesBatch[index] = {key, error: 'not_found'};\n }\n count++;\n if (count === keys.length) {\n onBatch(keys, valuesBatch, {});\n }\n };\n });\n}\n\nfunction createKeyRange(start, end, inclusiveEnd, key, descending) {\n try {\n if (start && end) {\n if (descending) {\n return IDBKeyRange.bound(end, start, !inclusiveEnd, false);\n } else {\n return IDBKeyRange.bound(start, end, false, !inclusiveEnd);\n }\n } else if (start) {\n if (descending) {\n return IDBKeyRange.upperBound(start);\n } else {\n return IDBKeyRange.lowerBound(start);\n }\n } else if (end) {\n if (descending) {\n return IDBKeyRange.lowerBound(end, !inclusiveEnd);\n } else {\n return IDBKeyRange.upperBound(end, !inclusiveEnd);\n }\n } else if (key) {\n return IDBKeyRange.only(key);\n }\n } catch (e) {\n return {error: e};\n }\n return null;\n}\n\nfunction idbAllDocs(opts, idb, callback) {\n var start = 'startkey' in opts ? opts.startkey : false;\n var end = 'endkey' in opts ? opts.endkey : false;\n var key = 'key' in opts ? opts.key : false;\n var keys = 'keys' in opts ? opts.keys : false;\n var skip = opts.skip || 0;\n var limit = typeof opts.limit === 'number' ? opts.limit : -1;\n var inclusiveEnd = opts.inclusive_end !== false;\n\n var keyRange ;\n var keyRangeError;\n if (!keys) {\n keyRange = createKeyRange(start, end, inclusiveEnd, key, opts.descending);\n keyRangeError = keyRange && keyRange.error;\n if (keyRangeError &&\n !(keyRangeError.name === \"DataError\" && keyRangeError.code === 0)) {\n // DataError with error code 0 indicates start is less than end, so\n // can just do an empty query. Else need to throw\n return callback(createError(IDB_ERROR,\n keyRangeError.name, keyRangeError.message));\n }\n }\n\n var stores = [DOC_STORE, BY_SEQ_STORE, META_STORE];\n\n if (opts.attachments) {\n stores.push(ATTACH_STORE);\n }\n var txnResult = openTransactionSafely(idb, stores, 'readonly');\n if (txnResult.error) {\n return callback(txnResult.error);\n }\n var txn = txnResult.txn;\n txn.oncomplete = onTxnComplete;\n txn.onabort = idbError(callback);\n var docStore = txn.objectStore(DOC_STORE);\n var seqStore = txn.objectStore(BY_SEQ_STORE);\n var metaStore = txn.objectStore(META_STORE);\n var docIdRevIndex = seqStore.index('_doc_id_rev');\n var results = [];\n var docCount;\n var updateSeq;\n\n metaStore.get(META_STORE).onsuccess = function (e) {\n docCount = e.target.result.docCount;\n };\n\n /* istanbul ignore if */\n if (opts.update_seq) {\n // get max updateSeq\n seqStore.openKeyCursor(null, 'prev').onsuccess = e => {\n var cursor = e.target.result;\n if (cursor && cursor.key) {\n updateSeq = cursor.key;\n }\n };\n }\n\n // if the user specifies include_docs=true, then we don't\n // want to block the main cursor while we're fetching the doc\n function fetchDocAsynchronously(metadata, row, winningRev$$1) {\n var key = metadata.id + \"::\" + winningRev$$1;\n docIdRevIndex.get(key).onsuccess = function onGetDoc(e) {\n row.doc = decodeDoc(e.target.result) || {};\n if (opts.conflicts) {\n var conflicts = collectConflicts(metadata);\n if (conflicts.length) {\n row.doc._conflicts = conflicts;\n }\n }\n fetchAttachmentsIfNecessary(row.doc, opts, txn);\n };\n }\n\n function allDocsInner(winningRev$$1, metadata) {\n var row = {\n id: metadata.id,\n key: metadata.id,\n value: {\n rev: winningRev$$1\n }\n };\n var deleted = metadata.deleted;\n if (deleted) {\n if (keys) {\n results.push(row);\n // deleted docs are okay with \"keys\" requests\n row.value.deleted = true;\n row.doc = null;\n }\n } else if (skip-- <= 0) {\n results.push(row);\n if (opts.include_docs) {\n fetchDocAsynchronously(metadata, row, winningRev$$1);\n }\n }\n }\n\n function processBatch(batchValues) {\n for (var i = 0, len = batchValues.length; i < len; i++) {\n if (results.length === limit) {\n break;\n }\n var batchValue = batchValues[i];\n if (batchValue.error && keys) {\n // key was not found with \"keys\" requests\n results.push(batchValue);\n continue;\n }\n var metadata = decodeMetadata(batchValue);\n var winningRev$$1 = metadata.winningRev;\n allDocsInner(winningRev$$1, metadata);\n }\n }\n\n function onBatch(batchKeys, batchValues, cursor) {\n if (!cursor) {\n return;\n }\n processBatch(batchValues);\n if (results.length < limit) {\n cursor.continue();\n }\n }\n\n function onGetAll(e) {\n var values = e.target.result;\n if (opts.descending) {\n values = values.reverse();\n }\n processBatch(values);\n }\n\n function onResultsReady() {\n var returnVal = {\n total_rows: docCount,\n offset: opts.skip,\n rows: results\n };\n\n /* istanbul ignore if */\n if (opts.update_seq && updateSeq !== undefined) {\n returnVal.update_seq = updateSeq;\n }\n callback(null, returnVal);\n }\n\n function onTxnComplete() {\n if (opts.attachments) {\n postProcessAttachments(results, opts.binary).then(onResultsReady);\n } else {\n onResultsReady();\n }\n }\n\n // don't bother doing any requests if start > end or limit === 0\n if (keyRangeError || limit === 0) {\n return;\n }\n if (keys) {\n return allDocsKeys(keys, docStore, onBatch);\n }\n if (limit === -1) { // just fetch everything\n return getAll(docStore, keyRange, onGetAll);\n }\n // else do a cursor\n // choose a batch size based on the skip, since we'll need to skip that many\n runBatchedCursor(docStore, keyRange, opts.descending, limit + skip, onBatch);\n}\n\nfunction countDocs(txn, cb) {\n var index = txn.objectStore(DOC_STORE).index('deletedOrLocal');\n index.count(IDBKeyRange.only('0')).onsuccess = function (e) {\n cb(e.target.result);\n };\n}\n\n// This task queue ensures that IDB open calls are done in their own tick\n\nvar running = false;\nvar queue = [];\n\nfunction tryCode(fun, err, res, PouchDB) {\n try {\n fun(err, res);\n } catch (err) {\n // Shouldn't happen, but in some odd cases\n // IndexedDB implementations might throw a sync\n // error, in which case this will at least log it.\n PouchDB.emit('error', err);\n }\n}\n\nfunction applyNext() {\n if (running || !queue.length) {\n return;\n }\n running = true;\n queue.shift()();\n}\n\nfunction enqueueTask(action, callback, PouchDB) {\n queue.push(function runAction() {\n action(function runCallback(err, res) {\n tryCode(callback, err, res, PouchDB);\n running = false;\n nextTick(function runNext() {\n applyNext(PouchDB);\n });\n });\n });\n applyNext();\n}\n\nfunction changes(opts, api, dbName, idb) {\n opts = clone(opts);\n\n if (opts.continuous) {\n var id = dbName + ':' + uuid();\n changesHandler.addListener(dbName, id, api, opts);\n changesHandler.notify(dbName);\n return {\n cancel: function () {\n changesHandler.removeListener(dbName, id);\n }\n };\n }\n\n var docIds = opts.doc_ids && new Set(opts.doc_ids);\n\n opts.since = opts.since || 0;\n var lastSeq = opts.since;\n\n var limit = 'limit' in opts ? opts.limit : -1;\n if (limit === 0) {\n limit = 1; // per CouchDB _changes spec\n }\n\n var results = [];\n var numResults = 0;\n var filter = filterChange(opts);\n var docIdsToMetadata = new Map();\n\n var txn;\n var bySeqStore;\n var docStore;\n var docIdRevIndex;\n\n function onBatch(batchKeys, batchValues, cursor) {\n if (!cursor || !batchKeys.length) { // done\n return;\n }\n\n var winningDocs = new Array(batchKeys.length);\n var metadatas = new Array(batchKeys.length);\n\n function processMetadataAndWinningDoc(metadata, winningDoc) {\n var change = opts.processChange(winningDoc, metadata, opts);\n lastSeq = change.seq = metadata.seq;\n\n var filtered = filter(change);\n if (typeof filtered === 'object') { // anything but true/false indicates error\n return Promise.reject(filtered);\n }\n\n if (!filtered) {\n return Promise.resolve();\n }\n numResults++;\n if (opts.return_docs) {\n results.push(change);\n }\n // process the attachment immediately\n // for the benefit of live listeners\n if (opts.attachments && opts.include_docs) {\n return new Promise(function (resolve) {\n fetchAttachmentsIfNecessary(winningDoc, opts, txn, function () {\n postProcessAttachments([change], opts.binary).then(function () {\n resolve(change);\n });\n });\n });\n } else {\n return Promise.resolve(change);\n }\n }\n\n function onBatchDone() {\n var promises = [];\n for (var i = 0, len = winningDocs.length; i < len; i++) {\n if (numResults === limit) {\n break;\n }\n var winningDoc = winningDocs[i];\n if (!winningDoc) {\n continue;\n }\n var metadata = metadatas[i];\n promises.push(processMetadataAndWinningDoc(metadata, winningDoc));\n }\n\n Promise.all(promises).then(function (changes) {\n for (var i = 0, len = changes.length; i < len; i++) {\n if (changes[i]) {\n opts.onChange(changes[i]);\n }\n }\n }).catch(opts.complete);\n\n if (numResults !== limit) {\n cursor.continue();\n }\n }\n\n // Fetch all metadatas/winningdocs from this batch in parallel, then process\n // them all only once all data has been collected. This is done in parallel\n // because it's faster than doing it one-at-a-time.\n var numDone = 0;\n batchValues.forEach(function (value, i) {\n var doc = decodeDoc(value);\n var seq = batchKeys[i];\n fetchWinningDocAndMetadata(doc, seq, function (metadata, winningDoc) {\n metadatas[i] = metadata;\n winningDocs[i] = winningDoc;\n if (++numDone === batchKeys.length) {\n onBatchDone();\n }\n });\n });\n }\n\n function onGetMetadata(doc, seq, metadata, cb) {\n if (metadata.seq !== seq) {\n // some other seq is later\n return cb();\n }\n\n if (metadata.winningRev === doc._rev) {\n // this is the winning doc\n return cb(metadata, doc);\n }\n\n // fetch winning doc in separate request\n var docIdRev = doc._id + '::' + metadata.winningRev;\n var req = docIdRevIndex.get(docIdRev);\n req.onsuccess = function (e) {\n cb(metadata, decodeDoc(e.target.result));\n };\n }\n\n function fetchWinningDocAndMetadata(doc, seq, cb) {\n if (docIds && !docIds.has(doc._id)) {\n return cb();\n }\n\n var metadata = docIdsToMetadata.get(doc._id);\n if (metadata) { // cached\n return onGetMetadata(doc, seq, metadata, cb);\n }\n // metadata not cached, have to go fetch it\n docStore.get(doc._id).onsuccess = function (e) {\n metadata = decodeMetadata(e.target.result);\n docIdsToMetadata.set(doc._id, metadata);\n onGetMetadata(doc, seq, metadata, cb);\n };\n }\n\n function finish() {\n opts.complete(null, {\n results,\n last_seq: lastSeq\n });\n }\n\n function onTxnComplete() {\n if (!opts.continuous && opts.attachments) {\n // cannot guarantee that postProcessing was already done,\n // so do it again\n postProcessAttachments(results).then(finish);\n } else {\n finish();\n }\n }\n\n var objectStores = [DOC_STORE, BY_SEQ_STORE];\n if (opts.attachments) {\n objectStores.push(ATTACH_STORE);\n }\n var txnResult = openTransactionSafely(idb, objectStores, 'readonly');\n if (txnResult.error) {\n return opts.complete(txnResult.error);\n }\n txn = txnResult.txn;\n txn.onabort = idbError(opts.complete);\n txn.oncomplete = onTxnComplete;\n\n bySeqStore = txn.objectStore(BY_SEQ_STORE);\n docStore = txn.objectStore(DOC_STORE);\n docIdRevIndex = bySeqStore.index('_doc_id_rev');\n\n var keyRange = (opts.since && !opts.descending) ?\n IDBKeyRange.lowerBound(opts.since, true) : null;\n\n runBatchedCursor(bySeqStore, keyRange, opts.descending, limit, onBatch);\n}\n\nvar cachedDBs = new Map();\nvar blobSupportPromise;\nvar openReqList = new Map();\n\nfunction IdbPouch(opts, callback) {\n var api = this;\n\n enqueueTask(function (thisCallback) {\n init(api, opts, thisCallback);\n }, callback, api.constructor);\n}\n\nfunction init(api, opts, callback) {\n\n var dbName = opts.name;\n\n var idb = null;\n var idbGlobalFailureError = null;\n api._meta = null;\n\n function enrichCallbackError(callback) {\n return function (error, result) {\n if (error && error instanceof Error && !error.reason) {\n if (idbGlobalFailureError) {\n error.reason = idbGlobalFailureError;\n }\n }\n\n callback(error, result);\n };\n }\n\n // called when creating a fresh new database\n function createSchema(db) {\n var docStore = db.createObjectStore(DOC_STORE, {keyPath : 'id'});\n db.createObjectStore(BY_SEQ_STORE, {autoIncrement: true})\n .createIndex('_doc_id_rev', '_doc_id_rev', {unique: true});\n db.createObjectStore(ATTACH_STORE, {keyPath: 'digest'});\n db.createObjectStore(META_STORE, {keyPath: 'id', autoIncrement: false});\n db.createObjectStore(DETECT_BLOB_SUPPORT_STORE);\n\n // added in v2\n docStore.createIndex('deletedOrLocal', 'deletedOrLocal', {unique : false});\n\n // added in v3\n db.createObjectStore(LOCAL_STORE, {keyPath: '_id'});\n\n // added in v4\n var attAndSeqStore = db.createObjectStore(ATTACH_AND_SEQ_STORE,\n {autoIncrement: true});\n attAndSeqStore.createIndex('seq', 'seq');\n attAndSeqStore.createIndex('digestSeq', 'digestSeq', {unique: true});\n }\n\n // migration to version 2\n // unfortunately \"deletedOrLocal\" is a misnomer now that we no longer\n // store local docs in the main doc-store, but whaddyagonnado\n function addDeletedOrLocalIndex(txn, callback) {\n var docStore = txn.objectStore(DOC_STORE);\n docStore.createIndex('deletedOrLocal', 'deletedOrLocal', {unique : false});\n\n docStore.openCursor().onsuccess = function (event) {\n var cursor = event.target.result;\n if (cursor) {\n var metadata = cursor.value;\n var deleted = isDeleted(metadata);\n metadata.deletedOrLocal = deleted ? \"1\" : \"0\";\n docStore.put(metadata);\n cursor.continue();\n } else {\n callback();\n }\n };\n }\n\n // migration to version 3 (part 1)\n function createLocalStoreSchema(db) {\n db.createObjectStore(LOCAL_STORE, {keyPath: '_id'})\n .createIndex('_doc_id_rev', '_doc_id_rev', {unique: true});\n }\n\n // migration to version 3 (part 2)\n function migrateLocalStore(txn, cb) {\n var localStore = txn.objectStore(LOCAL_STORE);\n var docStore = txn.objectStore(DOC_STORE);\n var seqStore = txn.objectStore(BY_SEQ_STORE);\n\n var cursor = docStore.openCursor();\n cursor.onsuccess = function (event) {\n var cursor = event.target.result;\n if (cursor) {\n var metadata = cursor.value;\n var docId = metadata.id;\n var local = isLocalId(docId);\n var rev$$1 = winningRev(metadata);\n if (local) {\n var docIdRev = docId + \"::\" + rev$$1;\n // remove all seq entries\n // associated with this docId\n var start = docId + \"::\";\n var end = docId + \"::~\";\n var index = seqStore.index('_doc_id_rev');\n var range = IDBKeyRange.bound(start, end, false, false);\n var seqCursor = index.openCursor(range);\n seqCursor.onsuccess = function (e) {\n seqCursor = e.target.result;\n if (!seqCursor) {\n // done\n docStore.delete(cursor.primaryKey);\n cursor.continue();\n } else {\n var data = seqCursor.value;\n if (data._doc_id_rev === docIdRev) {\n localStore.put(data);\n }\n seqStore.delete(seqCursor.primaryKey);\n seqCursor.continue();\n }\n };\n } else {\n cursor.continue();\n }\n } else if (cb) {\n cb();\n }\n };\n }\n\n // migration to version 4 (part 1)\n function addAttachAndSeqStore(db) {\n var attAndSeqStore = db.createObjectStore(ATTACH_AND_SEQ_STORE,\n {autoIncrement: true});\n attAndSeqStore.createIndex('seq', 'seq');\n attAndSeqStore.createIndex('digestSeq', 'digestSeq', {unique: true});\n }\n\n // migration to version 4 (part 2)\n function migrateAttsAndSeqs(txn, callback) {\n var seqStore = txn.objectStore(BY_SEQ_STORE);\n var attStore = txn.objectStore(ATTACH_STORE);\n var attAndSeqStore = txn.objectStore(ATTACH_AND_SEQ_STORE);\n\n // need to actually populate the table. this is the expensive part,\n // so as an optimization, check first that this database even\n // contains attachments\n var req = attStore.count();\n req.onsuccess = function (e) {\n var count = e.target.result;\n if (!count) {\n return callback(); // done\n }\n\n seqStore.openCursor().onsuccess = function (e) {\n var cursor = e.target.result;\n if (!cursor) {\n return callback(); // done\n }\n var doc = cursor.value;\n var seq = cursor.primaryKey;\n var atts = Object.keys(doc._attachments || {});\n var digestMap = {};\n for (var j = 0; j < atts.length; j++) {\n var att = doc._attachments[atts[j]];\n digestMap[att.digest] = true; // uniq digests, just in case\n }\n var digests = Object.keys(digestMap);\n for (j = 0; j < digests.length; j++) {\n var digest = digests[j];\n attAndSeqStore.put({\n seq,\n digestSeq: digest + '::' + seq\n });\n }\n cursor.continue();\n };\n };\n }\n\n // migration to version 5\n // Instead of relying on on-the-fly migration of metadata,\n // this brings the doc-store to its modern form:\n // - metadata.winningrev\n // - metadata.seq\n // - stringify the metadata when storing it\n function migrateMetadata(txn) {\n\n function decodeMetadataCompat(storedObject) {\n if (!storedObject.data) {\n // old format, when we didn't store it stringified\n storedObject.deleted = storedObject.deletedOrLocal === '1';\n return storedObject;\n }\n return decodeMetadata(storedObject);\n }\n\n // ensure that every metadata has a winningRev and seq,\n // which was previously created on-the-fly but better to migrate\n var bySeqStore = txn.objectStore(BY_SEQ_STORE);\n var docStore = txn.objectStore(DOC_STORE);\n var cursor = docStore.openCursor();\n cursor.onsuccess = function (e) {\n var cursor = e.target.result;\n if (!cursor) {\n return; // done\n }\n var metadata = decodeMetadataCompat(cursor.value);\n\n metadata.winningRev = metadata.winningRev ||\n winningRev(metadata);\n\n function fetchMetadataSeq() {\n // metadata.seq was added post-3.2.0, so if it's missing,\n // we need to fetch it manually\n var start = metadata.id + '::';\n var end = metadata.id + '::\\uffff';\n var req = bySeqStore.index('_doc_id_rev').openCursor(\n IDBKeyRange.bound(start, end));\n\n var metadataSeq = 0;\n req.onsuccess = function (e) {\n var cursor = e.target.result;\n if (!cursor) {\n metadata.seq = metadataSeq;\n return onGetMetadataSeq();\n }\n var seq = cursor.primaryKey;\n if (seq > metadataSeq) {\n metadataSeq = seq;\n }\n cursor.continue();\n };\n }\n\n function onGetMetadataSeq() {\n var metadataToStore = encodeMetadata(metadata,\n metadata.winningRev, metadata.deleted);\n\n var req = docStore.put(metadataToStore);\n req.onsuccess = function () {\n cursor.continue();\n };\n }\n\n if (metadata.seq) {\n return onGetMetadataSeq();\n }\n\n fetchMetadataSeq();\n };\n\n }\n\n api._remote = false;\n api.type = function () {\n return 'idb';\n };\n\n api._id = toPromise(function (callback) {\n callback(null, api._meta.instanceId);\n });\n\n api._bulkDocs = function idb_bulkDocs(req, reqOpts, callback) {\n idbBulkDocs(opts, req, reqOpts, api, idb, enrichCallbackError(callback));\n };\n\n // First we look up the metadata in the ids database, then we fetch the\n // current revision(s) from the by sequence store\n api._get = function idb_get(id, opts, callback) {\n var doc;\n var metadata;\n var err;\n var txn = opts.ctx;\n if (!txn) {\n var txnResult = openTransactionSafely(idb,\n [DOC_STORE, BY_SEQ_STORE, ATTACH_STORE], 'readonly');\n if (txnResult.error) {\n return callback(txnResult.error);\n }\n txn = txnResult.txn;\n }\n\n function finish() {\n callback(err, {doc, metadata, ctx: txn});\n }\n\n txn.objectStore(DOC_STORE).get(id).onsuccess = function (e) {\n metadata = decodeMetadata(e.target.result);\n // we can determine the result here if:\n // 1. there is no such document\n // 2. the document is deleted and we don't ask about specific rev\n // When we ask with opts.rev we expect the answer to be either\n // doc (possibly with _deleted=true) or missing error\n if (!metadata) {\n err = createError(MISSING_DOC, 'missing');\n return finish();\n }\n\n var rev$$1;\n if (!opts.rev) {\n rev$$1 = metadata.winningRev;\n var deleted = isDeleted(metadata);\n if (deleted) {\n err = createError(MISSING_DOC, \"deleted\");\n return finish();\n }\n } else {\n rev$$1 = opts.latest ? latest(opts.rev, metadata) : opts.rev;\n }\n\n var objectStore = txn.objectStore(BY_SEQ_STORE);\n var key = metadata.id + '::' + rev$$1;\n\n objectStore.index('_doc_id_rev').get(key).onsuccess = function (e) {\n doc = e.target.result;\n if (doc) {\n doc = decodeDoc(doc);\n }\n if (!doc) {\n err = createError(MISSING_DOC, 'missing');\n return finish();\n }\n finish();\n };\n };\n };\n\n api._getAttachment = function (docId, attachId, attachment, opts, callback) {\n var txn;\n if (opts.ctx) {\n txn = opts.ctx;\n } else {\n var txnResult = openTransactionSafely(idb,\n [DOC_STORE, BY_SEQ_STORE, ATTACH_STORE], 'readonly');\n if (txnResult.error) {\n return callback(txnResult.error);\n }\n txn = txnResult.txn;\n }\n var digest = attachment.digest;\n var type = attachment.content_type;\n\n txn.objectStore(ATTACH_STORE).get(digest).onsuccess = function (e) {\n var body = e.target.result.body;\n readBlobData(body, type, opts.binary, function (blobData) {\n callback(null, blobData);\n });\n };\n };\n\n api._info = function idb_info(callback) {\n var updateSeq;\n var docCount;\n\n var txnResult = openTransactionSafely(idb, [META_STORE, BY_SEQ_STORE], 'readonly');\n if (txnResult.error) {\n return callback(txnResult.error);\n }\n var txn = txnResult.txn;\n txn.objectStore(META_STORE).get(META_STORE).onsuccess = function (e) {\n docCount = e.target.result.docCount;\n };\n txn.objectStore(BY_SEQ_STORE).openKeyCursor(null, 'prev').onsuccess = function (e) {\n var cursor = e.target.result;\n updateSeq = cursor ? cursor.key : 0;\n };\n\n txn.oncomplete = function () {\n callback(null, {\n doc_count: docCount,\n update_seq: updateSeq,\n // for debugging\n idb_attachment_format: (api._meta.blobSupport ? 'binary' : 'base64')\n });\n };\n };\n\n api._allDocs = function idb_allDocs(opts, callback) {\n idbAllDocs(opts, idb, enrichCallbackError(callback));\n };\n\n api._changes = function idbChanges(opts) {\n return changes(opts, api, dbName, idb);\n };\n\n api._close = function (callback) {\n // https://developer.mozilla.org/en-US/docs/IndexedDB/IDBDatabase#close\n // \"Returns immediately and closes the connection in a separate thread...\"\n idb.close();\n cachedDBs.delete(dbName);\n callback();\n };\n\n api._getRevisionTree = function (docId, callback) {\n var txnResult = openTransactionSafely(idb, [DOC_STORE], 'readonly');\n if (txnResult.error) {\n return callback(txnResult.error);\n }\n var txn = txnResult.txn;\n var req = txn.objectStore(DOC_STORE).get(docId);\n req.onsuccess = function (event) {\n var doc = decodeMetadata(event.target.result);\n if (!doc) {\n callback(createError(MISSING_DOC));\n } else {\n callback(null, doc.rev_tree);\n }\n };\n };\n\n // This function removes revisions of document docId\n // which are listed in revs and sets this document\n // revision to to rev_tree\n api._doCompaction = function (docId, revs, callback) {\n var stores = [\n DOC_STORE,\n BY_SEQ_STORE,\n ATTACH_STORE,\n ATTACH_AND_SEQ_STORE\n ];\n var txnResult = openTransactionSafely(idb, stores, 'readwrite');\n if (txnResult.error) {\n return callback(txnResult.error);\n }\n var txn = txnResult.txn;\n\n var docStore = txn.objectStore(DOC_STORE);\n\n docStore.get(docId).onsuccess = function (event) {\n var metadata = decodeMetadata(event.target.result);\n traverseRevTree(metadata.rev_tree, function (isLeaf, pos,\n revHash, ctx, opts) {\n var rev$$1 = pos + '-' + revHash;\n if (revs.indexOf(rev$$1) !== -1) {\n opts.status = 'missing';\n }\n });\n compactRevs(revs, docId, txn);\n var winningRev$$1 = metadata.winningRev;\n var deleted = metadata.deleted;\n txn.objectStore(DOC_STORE).put(\n encodeMetadata(metadata, winningRev$$1, deleted));\n };\n txn.onabort = idbError(callback);\n txn.oncomplete = function () {\n callback();\n };\n };\n\n\n api._getLocal = function (id, callback) {\n var txnResult = openTransactionSafely(idb, [LOCAL_STORE], 'readonly');\n if (txnResult.error) {\n return callback(txnResult.error);\n }\n var tx = txnResult.txn;\n var req = tx.objectStore(LOCAL_STORE).get(id);\n\n req.onerror = idbError(callback);\n req.onsuccess = function (e) {\n var doc = e.target.result;\n if (!doc) {\n callback(createError(MISSING_DOC));\n } else {\n delete doc['_doc_id_rev']; // for backwards compat\n callback(null, doc);\n }\n };\n };\n\n api._putLocal = function (doc, opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n delete doc._revisions; // ignore this, trust the rev\n var oldRev = doc._rev;\n var id = doc._id;\n if (!oldRev) {\n doc._rev = '0-1';\n } else {\n doc._rev = '0-' + (parseInt(oldRev.split('-')[1], 10) + 1);\n }\n\n var tx = opts.ctx;\n var ret;\n if (!tx) {\n var txnResult = openTransactionSafely(idb, [LOCAL_STORE], 'readwrite');\n if (txnResult.error) {\n return callback(txnResult.error);\n }\n tx = txnResult.txn;\n tx.onerror = idbError(callback);\n tx.oncomplete = function () {\n if (ret) {\n callback(null, ret);\n }\n };\n }\n\n var oStore = tx.objectStore(LOCAL_STORE);\n var req;\n if (oldRev) {\n req = oStore.get(id);\n req.onsuccess = function (e) {\n var oldDoc = e.target.result;\n if (!oldDoc || oldDoc._rev !== oldRev) {\n callback(createError(REV_CONFLICT));\n } else { // update\n var req = oStore.put(doc);\n req.onsuccess = function () {\n ret = {ok: true, id: doc._id, rev: doc._rev};\n if (opts.ctx) { // return immediately\n callback(null, ret);\n }\n };\n }\n };\n } else { // new doc\n req = oStore.add(doc);\n req.onerror = function (e) {\n // constraint error, already exists\n callback(createError(REV_CONFLICT));\n e.preventDefault(); // avoid transaction abort\n e.stopPropagation(); // avoid transaction onerror\n };\n req.onsuccess = function () {\n ret = {ok: true, id: doc._id, rev: doc._rev};\n if (opts.ctx) { // return immediately\n callback(null, ret);\n }\n };\n }\n };\n\n api._removeLocal = function (doc, opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n var tx = opts.ctx;\n if (!tx) {\n var txnResult = openTransactionSafely(idb, [LOCAL_STORE], 'readwrite');\n if (txnResult.error) {\n return callback(txnResult.error);\n }\n tx = txnResult.txn;\n tx.oncomplete = function () {\n if (ret) {\n callback(null, ret);\n }\n };\n }\n var ret;\n var id = doc._id;\n var oStore = tx.objectStore(LOCAL_STORE);\n var req = oStore.get(id);\n\n req.onerror = idbError(callback);\n req.onsuccess = function (e) {\n var oldDoc = e.target.result;\n if (!oldDoc || oldDoc._rev !== doc._rev) {\n callback(createError(MISSING_DOC));\n } else {\n oStore.delete(id);\n ret = {ok: true, id, rev: '0-0'};\n if (opts.ctx) { // return immediately\n callback(null, ret);\n }\n }\n };\n };\n\n api._destroy = function (opts, callback) {\n changesHandler.removeAllListeners(dbName);\n\n //Close open request for \"dbName\" database to fix ie delay.\n var openReq = openReqList.get(dbName);\n if (openReq && openReq.result) {\n openReq.result.close();\n cachedDBs.delete(dbName);\n }\n var req = indexedDB.deleteDatabase(dbName);\n\n req.onsuccess = function () {\n //Remove open request from the list.\n openReqList.delete(dbName);\n if (hasLocalStorage() && (dbName in localStorage)) {\n delete localStorage[dbName];\n }\n callback(null, { 'ok': true });\n };\n\n req.onerror = idbError(callback);\n };\n\n var cached = cachedDBs.get(dbName);\n\n if (cached) {\n idb = cached.idb;\n api._meta = cached.global;\n return nextTick(function () {\n callback(null, api);\n });\n }\n\n var req = indexedDB.open(dbName, ADAPTER_VERSION);\n openReqList.set(dbName, req);\n\n req.onupgradeneeded = function (e) {\n var db = e.target.result;\n if (e.oldVersion < 1) {\n return createSchema(db); // new db, initial schema\n }\n // do migrations\n\n var txn = e.currentTarget.transaction;\n // these migrations have to be done in this function, before\n // control is returned to the event loop, because IndexedDB\n\n if (e.oldVersion < 3) {\n createLocalStoreSchema(db); // v2 -> v3\n }\n if (e.oldVersion < 4) {\n addAttachAndSeqStore(db); // v3 -> v4\n }\n\n var migrations = [\n addDeletedOrLocalIndex, // v1 -> v2\n migrateLocalStore, // v2 -> v3\n migrateAttsAndSeqs, // v3 -> v4\n migrateMetadata // v4 -> v5\n ];\n\n var i = e.oldVersion;\n\n function next() {\n var migration = migrations[i - 1];\n i++;\n if (migration) {\n migration(txn, next);\n }\n }\n\n next();\n };\n\n req.onsuccess = function (e) {\n\n idb = e.target.result;\n\n idb.onversionchange = function () {\n idb.close();\n cachedDBs.delete(dbName);\n };\n\n idb.onabort = function (e) {\n guardedConsole('error', 'Database has a global failure', e.target.error);\n idbGlobalFailureError = e.target.error;\n idb.close();\n cachedDBs.delete(dbName);\n };\n\n // Do a few setup operations (in parallel as much as possible):\n // 1. Fetch meta doc\n // 2. Check blob support\n // 3. Calculate docCount\n // 4. Generate an instanceId if necessary\n // 5. Store docCount and instanceId on meta doc\n\n var txn = idb.transaction([\n META_STORE,\n DETECT_BLOB_SUPPORT_STORE,\n DOC_STORE\n ], 'readwrite');\n\n var storedMetaDoc = false;\n var metaDoc;\n var docCount;\n var blobSupport;\n var instanceId;\n\n function completeSetup() {\n if (typeof blobSupport === 'undefined' || !storedMetaDoc) {\n return;\n }\n api._meta = {\n name: dbName,\n instanceId,\n blobSupport\n };\n\n cachedDBs.set(dbName, {\n idb,\n global: api._meta\n });\n callback(null, api);\n }\n\n function storeMetaDocIfReady() {\n if (typeof docCount === 'undefined' || typeof metaDoc === 'undefined') {\n return;\n }\n var instanceKey = dbName + '_id';\n if (instanceKey in metaDoc) {\n instanceId = metaDoc[instanceKey];\n } else {\n metaDoc[instanceKey] = instanceId = uuid();\n }\n metaDoc.docCount = docCount;\n txn.objectStore(META_STORE).put(metaDoc);\n }\n\n //\n // fetch or generate the instanceId\n //\n txn.objectStore(META_STORE).get(META_STORE).onsuccess = function (e) {\n metaDoc = e.target.result || { id: META_STORE };\n storeMetaDocIfReady();\n };\n\n //\n // countDocs\n //\n countDocs(txn, function (count) {\n docCount = count;\n storeMetaDocIfReady();\n });\n\n //\n // check blob support\n //\n if (!blobSupportPromise) {\n // make sure blob support is only checked once\n blobSupportPromise = checkBlobSupport(txn, DETECT_BLOB_SUPPORT_STORE, 'key');\n }\n\n blobSupportPromise.then(function (val) {\n blobSupport = val;\n completeSetup();\n });\n\n // only when the metadata put transaction has completed,\n // consider the setup done\n txn.oncomplete = function () {\n storedMetaDoc = true;\n completeSetup();\n };\n txn.onabort = idbError(callback);\n };\n\n req.onerror = function (e) {\n var msg = e.target.error && e.target.error.message;\n\n if (!msg) {\n msg = 'Failed to open indexedDB, are you in private browsing mode?';\n } else if (msg.indexOf(\"stored database is a higher version\") !== -1) {\n msg = new Error('This DB was created with the newer \"indexeddb\" adapter, but you are trying to open it with the older \"idb\" adapter');\n }\n\n guardedConsole('error', msg);\n callback(createError(IDB_ERROR, msg));\n };\n}\n\nIdbPouch.valid = function () {\n // Following #7085 buggy idb versions (typically Safari < 10.1) are\n // considered valid.\n\n // On Firefox SecurityError is thrown while referencing indexedDB if cookies\n // are not allowed. `typeof indexedDB` also triggers the error.\n try {\n // some outdated implementations of IDB that appear on Samsung\n // and HTC Android devices <4.4 are missing IDBKeyRange\n return typeof indexedDB !== 'undefined' && typeof IDBKeyRange !== 'undefined';\n } catch (e) {\n return false;\n }\n};\n\nfunction IDBPouch (PouchDB) {\n PouchDB.adapter('idb', IdbPouch, true);\n}\n\n// dead simple promise pool, inspired by https://github.com/timdp/es6-promise-pool\n// but much smaller in code size. limits the number of concurrent promises that are executed\n\n\nfunction pool(promiseFactories, limit) {\n return new Promise(function (resolve, reject) {\n var running = 0;\n var current = 0;\n var done = 0;\n var len = promiseFactories.length;\n var err;\n\n function runNext() {\n running++;\n promiseFactories[current++]().then(onSuccess, onError);\n }\n\n function doNext() {\n if (++done === len) {\n /* istanbul ignore if */\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n } else {\n runNextBatch();\n }\n }\n\n function onSuccess() {\n running--;\n doNext();\n }\n\n /* istanbul ignore next */\n function onError(thisErr) {\n running--;\n err = err || thisErr;\n doNext();\n }\n\n function runNextBatch() {\n while (running < limit && current < len) {\n runNext();\n }\n }\n\n runNextBatch();\n });\n}\n\nconst CHANGES_BATCH_SIZE = 25;\nconst MAX_SIMULTANEOUS_REVS = 50;\nconst CHANGES_TIMEOUT_BUFFER = 5000;\nconst DEFAULT_HEARTBEAT = 10000;\n\nconst supportsBulkGetMap = {};\n\nfunction readAttachmentsAsBlobOrBuffer(row) {\n const doc = row.doc || row.ok;\n const atts = doc && doc._attachments;\n if (!atts) {\n return;\n }\n Object.keys(atts).forEach(function (filename) {\n const att = atts[filename];\n att.data = b64ToBluffer(att.data, att.content_type);\n });\n}\n\nfunction encodeDocId(id) {\n if (/^_design/.test(id)) {\n return '_design/' + encodeURIComponent(id.slice(8));\n }\n if (id.startsWith('_local/')) {\n return '_local/' + encodeURIComponent(id.slice(7));\n }\n return encodeURIComponent(id);\n}\n\nfunction preprocessAttachments$1(doc) {\n if (!doc._attachments || !Object.keys(doc._attachments)) {\n return Promise.resolve();\n }\n\n return Promise.all(Object.keys(doc._attachments).map(function (key) {\n const attachment = doc._attachments[key];\n if (attachment.data && typeof attachment.data !== 'string') {\n return new Promise(function (resolve) {\n blobToBase64(attachment.data, resolve);\n }).then(function (b64) {\n attachment.data = b64;\n });\n }\n }));\n}\n\nfunction hasUrlPrefix(opts) {\n if (!opts.prefix) {\n return false;\n }\n const protocol = parseUri(opts.prefix).protocol;\n return protocol === 'http' || protocol === 'https';\n}\n\n// Get all the information you possibly can about the URI given by name and\n// return it as a suitable object.\nfunction getHost(name, opts) {\n // encode db name if opts.prefix is a url (#5574)\n if (hasUrlPrefix(opts)) {\n const dbName = opts.name.substr(opts.prefix.length);\n // Ensure prefix has a trailing slash\n const prefix = opts.prefix.replace(/\\/?$/, '/');\n name = prefix + encodeURIComponent(dbName);\n }\n\n const uri = parseUri(name);\n if (uri.user || uri.password) {\n uri.auth = {username: uri.user, password: uri.password};\n }\n\n // Split the path part of the URI into parts using '/' as the delimiter\n // after removing any leading '/' and any trailing '/'\n const parts = uri.path.replace(/(^\\/|\\/$)/g, '').split('/');\n\n uri.db = parts.pop();\n // Prevent double encoding of URI component\n if (uri.db.indexOf('%') === -1) {\n uri.db = encodeURIComponent(uri.db);\n }\n\n uri.path = parts.join('/');\n\n return uri;\n}\n\n// Generate a URL with the host data given by opts and the given path\nfunction genDBUrl(opts, path) {\n return genUrl(opts, opts.db + '/' + path);\n}\n\n// Generate a URL with the host data given by opts and the given path\nfunction genUrl(opts, path) {\n // If the host already has a path, then we need to have a path delimiter\n // Otherwise, the path delimiter is the empty string\n const pathDel = !opts.path ? '' : '/';\n\n // If the host already has a path, then we need to have a path delimiter\n // Otherwise, the path delimiter is the empty string\n return opts.protocol + '://' + opts.host +\n (opts.port ? (':' + opts.port) : '') +\n '/' + opts.path + pathDel + path;\n}\n\nfunction paramsToStr(params) {\n const paramKeys = Object.keys(params);\n if (paramKeys.length === 0) {\n return '';\n }\n\n return '?' + paramKeys.map(key => key + '=' + encodeURIComponent(params[key])).join('&');\n}\n\nfunction shouldCacheBust(opts) {\n const ua = (typeof navigator !== 'undefined' && navigator.userAgent) ?\n navigator.userAgent.toLowerCase() : '';\n const isIE = ua.indexOf('msie') !== -1;\n const isTrident = ua.indexOf('trident') !== -1;\n const isEdge = ua.indexOf('edge') !== -1;\n const isGET = !('method' in opts) || opts.method === 'GET';\n return (isIE || isTrident || isEdge) && isGET;\n}\n\n// Implements the PouchDB API for dealing with CouchDB instances over HTTP\nfunction HttpPouch(opts, callback) {\n\n // The functions that will be publicly available for HttpPouch\n const api = this;\n\n const host = getHost(opts.name, opts);\n const dbUrl = genDBUrl(host, '');\n\n opts = clone(opts);\n\n const ourFetch = async function (url, options) {\n\n options = options || {};\n options.headers = options.headers || new h();\n\n options.credentials = 'include';\n\n if (opts.auth || host.auth) {\n const nAuth = opts.auth || host.auth;\n const str = nAuth.username + ':' + nAuth.password;\n const token = thisBtoa(unescape(encodeURIComponent(str)));\n options.headers.set('Authorization', 'Basic ' + token);\n }\n\n const headers = opts.headers || {};\n Object.keys(headers).forEach(function (key) {\n options.headers.append(key, headers[key]);\n });\n\n /* istanbul ignore if */\n if (shouldCacheBust(options)) {\n url += (url.indexOf('?') === -1 ? '?' : '&') + '_nonce=' + Date.now();\n }\n\n const fetchFun = opts.fetch || f$1;\n return await fetchFun(url, options);\n };\n\n function adapterFun$$1(name, fun) {\n return adapterFun(name, function (...args) {\n setup().then(function () {\n return fun.apply(this, args);\n }).catch(function (e) {\n const callback = args.pop();\n callback(e);\n });\n }).bind(api);\n }\n\n async function fetchJSON(url, options) {\n\n const result = {};\n\n options = options || {};\n options.headers = options.headers || new h();\n\n if (!options.headers.get('Content-Type')) {\n options.headers.set('Content-Type', 'application/json');\n }\n if (!options.headers.get('Accept')) {\n options.headers.set('Accept', 'application/json');\n }\n\n const response = await ourFetch(url, options);\n result.ok = response.ok;\n result.status = response.status;\n const json = await response.json();\n\n result.data = json;\n if (!result.ok) {\n result.data.status = result.status;\n const err = generateErrorFromResponse(result.data);\n throw err;\n }\n\n if (Array.isArray(result.data)) {\n result.data = result.data.map(function (v) {\n if (v.error || v.missing) {\n return generateErrorFromResponse(v);\n } else {\n return v;\n }\n });\n }\n\n return result;\n }\n\n let setupPromise;\n\n async function setup() {\n if (opts.skip_setup) {\n return Promise.resolve();\n }\n\n // If there is a setup in process or previous successful setup\n // done then we will use that\n // If previous setups have been rejected we will try again\n if (setupPromise) {\n return setupPromise;\n }\n\n setupPromise = fetchJSON(dbUrl).catch(function (err) {\n if (err && err.status && err.status === 404) {\n // Doesnt exist, create it\n explainError(404, 'PouchDB is just detecting if the remote exists.');\n return fetchJSON(dbUrl, {method: 'PUT'});\n } else {\n return Promise.reject(err);\n }\n }).catch(function (err) {\n // If we try to create a database that already exists, skipped in\n // istanbul since its catching a race condition.\n /* istanbul ignore if */\n if (err && err.status && err.status === 412) {\n return true;\n }\n return Promise.reject(err);\n });\n\n setupPromise.catch(function () {\n setupPromise = null;\n });\n\n return setupPromise;\n }\n\n nextTick(function () {\n callback(null, api);\n });\n\n api._remote = true;\n\n /* istanbul ignore next */\n api.type = function () {\n return 'http';\n };\n\n api.id = adapterFun$$1('id', async function (callback) {\n let result;\n try {\n const response = await ourFetch(genUrl(host, ''));\n result = await response.json();\n } catch (err) {\n result = {};\n }\n\n // Bad response or missing `uuid` should not prevent ID generation.\n const uuid$$1 = (result && result.uuid) ? (result.uuid + host.db) : genDBUrl(host, '');\n callback(null, uuid$$1);\n });\n\n // Sends a POST request to the host calling the couchdb _compact function\n // version: The version of CouchDB it is running\n api.compact = adapterFun$$1('compact', async function (opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n opts = clone(opts);\n\n await fetchJSON(genDBUrl(host, '_compact'), {method: 'POST'});\n\n function ping() {\n api.info(function (err, res) {\n // CouchDB may send a \"compact_running:true\" if it's\n // already compacting. PouchDB Server doesn't.\n /* istanbul ignore else */\n if (res && !res.compact_running) {\n callback(null, {ok: true});\n } else {\n setTimeout(ping, opts.interval || 200);\n }\n });\n }\n // Ping the http if it's finished compaction\n ping();\n });\n\n api.bulkGet = adapterFun('bulkGet', function (opts, callback) {\n const self = this;\n\n async function doBulkGet(cb) {\n const params = {};\n if (opts.revs) {\n params.revs = true;\n }\n if (opts.attachments) {\n /* istanbul ignore next */\n params.attachments = true;\n }\n if (opts.latest) {\n params.latest = true;\n }\n try {\n const result = await fetchJSON(genDBUrl(host, '_bulk_get' + paramsToStr(params)), {\n method: 'POST',\n body: JSON.stringify({ docs: opts.docs})\n });\n\n if (opts.attachments && opts.binary) {\n result.data.results.forEach(function (res) {\n res.docs.forEach(readAttachmentsAsBlobOrBuffer);\n });\n }\n cb(null, result.data);\n } catch (error) {\n cb(error);\n }\n }\n\n /* istanbul ignore next */\n function doBulkGetShim() {\n // avoid \"url too long error\" by splitting up into multiple requests\n const batchSize = MAX_SIMULTANEOUS_REVS;\n const numBatches = Math.ceil(opts.docs.length / batchSize);\n let numDone = 0;\n const results = new Array(numBatches);\n\n function onResult(batchNum) {\n return function (err, res) {\n // err is impossible because shim returns a list of errs in that case\n results[batchNum] = res.results;\n if (++numDone === numBatches) {\n callback(null, {results: results.flat()});\n }\n };\n }\n\n for (let i = 0; i < numBatches; i++) {\n const subOpts = pick(opts, ['revs', 'attachments', 'binary', 'latest']);\n subOpts.docs = opts.docs.slice(i * batchSize,\n Math.min(opts.docs.length, (i + 1) * batchSize));\n bulkGet(self, subOpts, onResult(i));\n }\n }\n\n // mark the whole database as either supporting or not supporting _bulk_get\n const dbUrl = genUrl(host, '');\n const supportsBulkGet = supportsBulkGetMap[dbUrl];\n\n /* istanbul ignore next */\n if (typeof supportsBulkGet !== 'boolean') {\n // check if this database supports _bulk_get\n doBulkGet(function (err, res) {\n if (err) {\n supportsBulkGetMap[dbUrl] = false;\n explainError(\n err.status,\n 'PouchDB is just detecting if the remote ' +\n 'supports the _bulk_get API.'\n );\n doBulkGetShim();\n } else {\n supportsBulkGetMap[dbUrl] = true;\n callback(null, res);\n }\n });\n } else if (supportsBulkGet) {\n doBulkGet(callback);\n } else {\n doBulkGetShim();\n }\n });\n\n // Calls GET on the host, which gets back a JSON string containing\n // couchdb: A welcome string\n // version: The version of CouchDB it is running\n api._info = async function (callback) {\n try {\n await setup();\n const response = await ourFetch(genDBUrl(host, ''));\n const info = await response.json();\n info.host = genDBUrl(host, '');\n callback(null, info);\n } catch (err) {\n callback(err);\n }\n };\n\n api.fetch = async function (path, options) {\n await setup();\n const url = path.substring(0, 1) === '/' ?\n genUrl(host, path.substring(1)) :\n genDBUrl(host, path);\n return ourFetch(url, options);\n };\n\n // Get the document with the given id from the database given by host.\n // The id could be solely the _id in the database, or it may be a\n // _design/ID or _local/ID path\n api.get = adapterFun$$1('get', async function (id, opts, callback) {\n // If no options were given, set the callback to the second parameter\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n opts = clone(opts);\n\n // List of parameters to add to the GET request\n const params = {};\n\n if (opts.revs) {\n params.revs = true;\n }\n\n if (opts.revs_info) {\n params.revs_info = true;\n }\n\n if (opts.latest) {\n params.latest = true;\n }\n\n if (opts.open_revs) {\n if (opts.open_revs !== \"all\") {\n opts.open_revs = JSON.stringify(opts.open_revs);\n }\n params.open_revs = opts.open_revs;\n }\n\n if (opts.rev) {\n params.rev = opts.rev;\n }\n\n if (opts.conflicts) {\n params.conflicts = opts.conflicts;\n }\n\n /* istanbul ignore if */\n if (opts.update_seq) {\n params.update_seq = opts.update_seq;\n }\n\n id = encodeDocId(id);\n\n function fetchAttachments(doc) {\n const atts = doc._attachments;\n const filenames = atts && Object.keys(atts);\n if (!atts || !filenames.length) {\n return;\n }\n // we fetch these manually in separate XHRs, because\n // Sync Gateway would normally send it back as multipart/mixed,\n // which we cannot parse. Also, this is more efficient than\n // receiving attachments as base64-encoded strings.\n async function fetchData(filename) {\n const att = atts[filename];\n const path = encodeDocId(doc._id) + '/' + encodeAttachmentId(filename) +\n '?rev=' + doc._rev;\n\n const response = await ourFetch(genDBUrl(host, path));\n\n let blob;\n if ('buffer' in response) {\n blob = await response.buffer();\n } else {\n /* istanbul ignore next */\n blob = await response.blob();\n }\n\n let data;\n if (opts.binary) {\n const typeFieldDescriptor = Object.getOwnPropertyDescriptor(blob.__proto__, 'type');\n if (!typeFieldDescriptor || typeFieldDescriptor.set) {\n blob.type = att.content_type;\n }\n data = blob;\n } else {\n data = await new Promise(function (resolve) {\n blobToBase64(blob, resolve);\n });\n }\n\n delete att.stub;\n delete att.length;\n att.data = data;\n }\n\n const promiseFactories = filenames.map(function (filename) {\n return function () {\n return fetchData(filename);\n };\n });\n\n // This limits the number of parallel xhr requests to 5 any time\n // to avoid issues with maximum browser request limits\n return pool(promiseFactories, 5);\n }\n\n function fetchAllAttachments(docOrDocs) {\n if (Array.isArray(docOrDocs)) {\n return Promise.all(docOrDocs.map(function (doc) {\n if (doc.ok) {\n return fetchAttachments(doc.ok);\n }\n }));\n }\n return fetchAttachments(docOrDocs);\n }\n\n const url = genDBUrl(host, id + paramsToStr(params));\n try {\n const res = await fetchJSON(url);\n if (opts.attachments) {\n await fetchAllAttachments(res.data);\n }\n callback(null, res.data);\n } catch (error) {\n error.docId = id;\n callback(error);\n }\n });\n\n\n // Delete the document given by doc from the database given by host.\n api.remove = adapterFun$$1('remove', async function (docOrId, optsOrRev, opts, cb) {\n let doc;\n if (typeof optsOrRev === 'string') {\n // id, rev, opts, callback style\n doc = {\n _id: docOrId,\n _rev: optsOrRev\n };\n if (typeof opts === 'function') {\n cb = opts;\n opts = {};\n }\n } else {\n // doc, opts, callback style\n doc = docOrId;\n if (typeof optsOrRev === 'function') {\n cb = optsOrRev;\n opts = {};\n } else {\n cb = opts;\n opts = optsOrRev;\n }\n }\n\n const rev$$1 = (doc._rev || opts.rev);\n const url = genDBUrl(host, encodeDocId(doc._id)) + '?rev=' + rev$$1;\n\n try {\n const result = await fetchJSON(url, {method: 'DELETE'});\n cb(null, result.data);\n } catch (error) {\n cb(error);\n }\n });\n\n function encodeAttachmentId(attachmentId) {\n return attachmentId.split(\"/\").map(encodeURIComponent).join(\"/\");\n }\n\n // Get the attachment\n api.getAttachment = adapterFun$$1('getAttachment', async function (docId, attachmentId,\n opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n const params = opts.rev ? ('?rev=' + opts.rev) : '';\n const url = genDBUrl(host, encodeDocId(docId)) + '/' +\n encodeAttachmentId(attachmentId) + params;\n let contentType;\n try {\n const response = await ourFetch(url, {method: 'GET'});\n\n if (!response.ok) {\n throw response;\n }\n\n contentType = response.headers.get('content-type');\n let blob;\n if (typeof process !== 'undefined' && !process.browser && typeof response.buffer === 'function') {\n blob = await response.buffer();\n } else {\n /* istanbul ignore next */\n blob = await response.blob();\n }\n\n // TODO: also remove\n if (typeof process !== 'undefined' && !process.browser) {\n const typeFieldDescriptor = Object.getOwnPropertyDescriptor(blob.__proto__, 'type');\n if (!typeFieldDescriptor || typeFieldDescriptor.set) {\n blob.type = contentType;\n }\n }\n callback(null, blob);\n } catch (err) {\n callback(err);\n }\n });\n\n // Remove the attachment given by the id and rev\n api.removeAttachment = adapterFun$$1('removeAttachment', async function (\n docId,\n attachmentId,\n rev$$1,\n callback,\n ) {\n const url = genDBUrl(host, encodeDocId(docId) + '/' + encodeAttachmentId(attachmentId)) + '?rev=' + rev$$1;\n\n try {\n const result = await fetchJSON(url, {method: 'DELETE'});\n callback(null, result.data);\n } catch (error) {\n callback(error);\n }\n });\n\n // Add the attachment given by blob and its contentType property\n // to the document with the given id, the revision given by rev, and\n // add it to the database given by host.\n api.putAttachment = adapterFun$$1('putAttachment', async function (\n docId,\n attachmentId,\n rev$$1,\n blob,\n type,\n callback,\n ) {\n if (typeof type === 'function') {\n callback = type;\n type = blob;\n blob = rev$$1;\n rev$$1 = null;\n }\n const id = encodeDocId(docId) + '/' + encodeAttachmentId(attachmentId);\n let url = genDBUrl(host, id);\n if (rev$$1) {\n url += '?rev=' + rev$$1;\n }\n\n if (typeof blob === 'string') {\n // input is assumed to be a base64 string\n let binary;\n try {\n binary = thisAtob(blob);\n } catch (err) {\n return callback(createError(BAD_ARG,\n 'Attachment is not a valid base64 string'));\n }\n blob = binary ? binStringToBluffer(binary, type) : '';\n }\n\n try {\n // Add the attachment\n const result = await fetchJSON(url, {\n headers: new h({'Content-Type': type}),\n method: 'PUT',\n body: blob\n });\n callback(null, result.data);\n } catch (error) {\n callback(error);\n }\n });\n\n // Update/create multiple documents given by req in the database\n // given by host.\n api._bulkDocs = async function (req, opts, callback) {\n // If new_edits=false then it prevents the database from creating\n // new revision numbers for the documents. Instead it just uses\n // the old ones. This is used in database replication.\n req.new_edits = opts.new_edits;\n\n try {\n await setup();\n await Promise.all(req.docs.map(preprocessAttachments$1));\n\n // Update/create the documents\n const result = await fetchJSON(genDBUrl(host, '_bulk_docs'), {\n method: 'POST',\n body: JSON.stringify(req)\n });\n callback(null, result.data);\n } catch (error) {\n callback(error);\n }\n };\n\n // Update/create document\n api._put = async function (doc, opts, callback) {\n try {\n await setup();\n await preprocessAttachments$1(doc);\n\n const result = await fetchJSON(genDBUrl(host, encodeDocId(doc._id)), {\n method: 'PUT',\n body: JSON.stringify(doc)\n });\n callback(null, result.data);\n } catch (error) {\n error.docId = doc && doc._id;\n callback(error);\n }\n };\n\n\n // Get a listing of the documents in the database given\n // by host and ordered by increasing id.\n api.allDocs = adapterFun$$1('allDocs', async function (opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n opts = clone(opts);\n\n // List of parameters to add to the GET request\n const params = {};\n let body;\n let method = 'GET';\n\n if (opts.conflicts) {\n params.conflicts = true;\n }\n\n /* istanbul ignore if */\n if (opts.update_seq) {\n params.update_seq = true;\n }\n\n if (opts.descending) {\n params.descending = true;\n }\n\n if (opts.include_docs) {\n params.include_docs = true;\n }\n\n // added in CouchDB 1.6.0\n if (opts.attachments) {\n params.attachments = true;\n }\n\n if (opts.key) {\n params.key = JSON.stringify(opts.key);\n }\n\n if (opts.start_key) {\n opts.startkey = opts.start_key;\n }\n\n if (opts.startkey) {\n params.startkey = JSON.stringify(opts.startkey);\n }\n\n if (opts.end_key) {\n opts.endkey = opts.end_key;\n }\n\n if (opts.endkey) {\n params.endkey = JSON.stringify(opts.endkey);\n }\n\n if (typeof opts.inclusive_end !== 'undefined') {\n params.inclusive_end = !!opts.inclusive_end;\n }\n\n if (typeof opts.limit !== 'undefined') {\n params.limit = opts.limit;\n }\n\n if (typeof opts.skip !== 'undefined') {\n params.skip = opts.skip;\n }\n\n const paramStr = paramsToStr(params);\n\n if (typeof opts.keys !== 'undefined') {\n method = 'POST';\n body = {keys: opts.keys};\n }\n\n try {\n const result = await fetchJSON(genDBUrl(host, '_all_docs' + paramStr), {\n method,\n body: JSON.stringify(body)\n });\n if (opts.include_docs && opts.attachments && opts.binary) {\n result.data.rows.forEach(readAttachmentsAsBlobOrBuffer);\n }\n callback(null, result.data);\n } catch (error) {\n callback(error);\n }\n });\n\n // Get a list of changes made to documents in the database given by host.\n // TODO According to the README, there should be two other methods here,\n // api.changes.addListener and api.changes.removeListener.\n api._changes = function (opts) {\n\n // We internally page the results of a changes request, this means\n // if there is a large set of changes to be returned we can start\n // processing them quicker instead of waiting on the entire\n // set of changes to return and attempting to process them at once\n const batchSize = 'batch_size' in opts ? opts.batch_size : CHANGES_BATCH_SIZE;\n\n opts = clone(opts);\n\n if (opts.continuous && !('heartbeat' in opts)) {\n opts.heartbeat = DEFAULT_HEARTBEAT;\n }\n\n let requestTimeout = ('timeout' in opts) ? opts.timeout : 30 * 1000;\n\n // ensure CHANGES_TIMEOUT_BUFFER applies\n if ('timeout' in opts && opts.timeout &&\n (requestTimeout - opts.timeout) < CHANGES_TIMEOUT_BUFFER) {\n requestTimeout = opts.timeout + CHANGES_TIMEOUT_BUFFER;\n }\n\n /* istanbul ignore if */\n if ('heartbeat' in opts && opts.heartbeat &&\n (requestTimeout - opts.heartbeat) < CHANGES_TIMEOUT_BUFFER) {\n requestTimeout = opts.heartbeat + CHANGES_TIMEOUT_BUFFER;\n }\n\n const params = {};\n if ('timeout' in opts && opts.timeout) {\n params.timeout = opts.timeout;\n }\n\n const limit = (typeof opts.limit !== 'undefined') ? opts.limit : false;\n let leftToFetch = limit;\n\n if (opts.style) {\n params.style = opts.style;\n }\n\n if (opts.include_docs || opts.filter && typeof opts.filter === 'function') {\n params.include_docs = true;\n }\n\n if (opts.attachments) {\n params.attachments = true;\n }\n\n if (opts.continuous) {\n params.feed = 'longpoll';\n }\n\n if (opts.seq_interval) {\n params.seq_interval = opts.seq_interval;\n }\n\n if (opts.conflicts) {\n params.conflicts = true;\n }\n\n if (opts.descending) {\n params.descending = true;\n }\n\n /* istanbul ignore if */\n if (opts.update_seq) {\n params.update_seq = true;\n }\n\n if ('heartbeat' in opts) {\n // If the heartbeat value is false, it disables the default heartbeat\n if (opts.heartbeat) {\n params.heartbeat = opts.heartbeat;\n }\n }\n\n if (opts.filter && typeof opts.filter === 'string') {\n params.filter = opts.filter;\n }\n\n if (opts.view && typeof opts.view === 'string') {\n params.filter = '_view';\n params.view = opts.view;\n }\n\n // If opts.query_params exists, pass it through to the changes request.\n // These parameters may be used by the filter on the source database.\n if (opts.query_params && typeof opts.query_params === 'object') {\n for (const param_name in opts.query_params) {\n /* istanbul ignore else */\n if (Object.prototype.hasOwnProperty.call(opts.query_params, param_name)) {\n params[param_name] = opts.query_params[param_name];\n }\n }\n }\n\n let method = 'GET';\n let body;\n\n if (opts.doc_ids) {\n // set this automagically for the user; it's annoying that couchdb\n // requires both a \"filter\" and a \"doc_ids\" param.\n params.filter = '_doc_ids';\n method = 'POST';\n body = {doc_ids: opts.doc_ids };\n }\n /* istanbul ignore next */\n else if (opts.selector) {\n // set this automagically for the user, similar to above\n params.filter = '_selector';\n method = 'POST';\n body = {selector: opts.selector };\n }\n\n const controller = new AbortController();\n let lastFetchedSeq;\n\n // Get all the changes starting with the one immediately after the\n // sequence number given by since.\n const fetchData = async function (since, callback) {\n if (opts.aborted) {\n return;\n }\n params.since = since;\n // \"since\" can be any kind of json object in Cloudant/CouchDB 2.x\n /* istanbul ignore next */\n if (typeof params.since === \"object\") {\n params.since = JSON.stringify(params.since);\n }\n\n if (opts.descending) {\n if (limit) {\n params.limit = leftToFetch;\n }\n } else {\n params.limit = (!limit || leftToFetch > batchSize) ?\n batchSize : leftToFetch;\n }\n\n // Set the options for the ajax call\n const url = genDBUrl(host, '_changes' + paramsToStr(params));\n const fetchOpts = {\n signal: controller.signal,\n method,\n body: JSON.stringify(body)\n };\n lastFetchedSeq = since;\n\n /* istanbul ignore if */\n if (opts.aborted) {\n return;\n }\n\n // Get the changes\n try {\n await setup();\n const result = await fetchJSON(url, fetchOpts);\n callback(null, result.data);\n } catch (error) {\n callback(error);\n }\n };\n\n // If opts.since exists, get all the changes from the sequence\n // number given by opts.since. Otherwise, get all the changes\n // from the sequence number 0.\n const results = {results: []};\n\n const fetched = function (err, res) {\n if (opts.aborted) {\n return;\n }\n let raw_results_length = 0;\n // If the result of the ajax call (res) contains changes (res.results)\n if (res && res.results) {\n raw_results_length = res.results.length;\n results.last_seq = res.last_seq;\n let pending = null;\n let lastSeq = null;\n // Attach 'pending' property if server supports it (CouchDB 2.0+)\n /* istanbul ignore if */\n if (typeof res.pending === 'number') {\n pending = res.pending;\n }\n if (typeof results.last_seq === 'string' || typeof results.last_seq === 'number') {\n lastSeq = results.last_seq;\n }\n // For each change\n const req = {};\n req.query = opts.query_params;\n res.results = res.results.filter(function (c) {\n leftToFetch--;\n const ret = filterChange(opts)(c);\n if (ret) {\n if (opts.include_docs && opts.attachments && opts.binary) {\n readAttachmentsAsBlobOrBuffer(c);\n }\n if (opts.return_docs) {\n results.results.push(c);\n }\n opts.onChange(c, pending, lastSeq);\n }\n return ret;\n });\n } else if (err) {\n // In case of an error, stop listening for changes and call\n // opts.complete\n opts.aborted = true;\n opts.complete(err);\n return;\n }\n\n // The changes feed may have timed out with no results\n // if so reuse last update sequence\n if (res && res.last_seq) {\n lastFetchedSeq = res.last_seq;\n }\n\n const finished = (limit && leftToFetch <= 0) ||\n (res && raw_results_length < batchSize) ||\n (opts.descending);\n\n if ((opts.continuous && !(limit && leftToFetch <= 0)) || !finished) {\n // Queue a call to fetch again with the newest sequence number\n nextTick(function () { fetchData(lastFetchedSeq, fetched); });\n } else {\n // We're done, call the callback\n opts.complete(null, results);\n }\n };\n\n fetchData(opts.since || 0, fetched);\n\n // Return a method to cancel this method from processing any more\n return {\n cancel: function () {\n opts.aborted = true;\n controller.abort();\n }\n };\n };\n\n // Given a set of document/revision IDs (given by req), tets the subset of\n // those that do NOT correspond to revisions stored in the database.\n // See http://wiki.apache.org/couchdb/HttpPostRevsDiff\n api.revsDiff = adapterFun$$1('revsDiff', async function (req, opts, callback) {\n // If no options were given, set the callback to be the second parameter\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n\n try {\n // Get the missing document/revision IDs\n const result = await fetchJSON(genDBUrl(host, '_revs_diff'), {\n method: 'POST',\n body: JSON.stringify(req)\n });\n callback(null, result.data);\n } catch (error) {\n callback(error);\n }\n });\n\n api._close = function (callback) {\n callback();\n };\n\n api._destroy = async function (options, callback) {\n try {\n const json = await fetchJSON(genDBUrl(host, ''), {method: 'DELETE'});\n callback(null, json);\n } catch (error) {\n if (error.status === 404) {\n callback(null, {ok: true});\n } else {\n callback(error);\n }\n }\n };\n}\n\n// HttpPouch is a valid adapter.\nHttpPouch.valid = function () {\n return true;\n};\n\nfunction HttpPouch$1 (PouchDB) {\n PouchDB.adapter('http', HttpPouch, false);\n PouchDB.adapter('https', HttpPouch, false);\n}\n\nclass QueryParseError extends Error {\n constructor(message) {\n super();\n this.status = 400;\n this.name = 'query_parse_error';\n this.message = message;\n this.error = true;\n try {\n Error.captureStackTrace(this, QueryParseError);\n } catch (e) {}\n }\n}\n\nclass NotFoundError extends Error {\n constructor(message) {\n super();\n this.status = 404;\n this.name = 'not_found';\n this.message = message;\n this.error = true;\n try {\n Error.captureStackTrace(this, NotFoundError);\n } catch (e) {}\n }\n}\n\nclass BuiltInError extends Error {\n constructor(message) {\n super();\n this.status = 500;\n this.name = 'invalid_value';\n this.message = message;\n this.error = true;\n try {\n Error.captureStackTrace(this, BuiltInError);\n } catch (e) {}\n }\n}\n\nfunction promisedCallback(promise, callback) {\n if (callback) {\n promise.then(function (res) {\n nextTick(function () {\n callback(null, res);\n });\n }, function (reason) {\n nextTick(function () {\n callback(reason);\n });\n });\n }\n return promise;\n}\n\nfunction callbackify(fun) {\n return function (...args) {\n var cb = args.pop();\n var promise = fun.apply(this, args);\n if (typeof cb === 'function') {\n promisedCallback(promise, cb);\n }\n return promise;\n };\n}\n\n// Promise finally util similar to Q.finally\nfunction fin(promise, finalPromiseFactory) {\n return promise.then(function (res) {\n return finalPromiseFactory().then(function () {\n return res;\n });\n }, function (reason) {\n return finalPromiseFactory().then(function () {\n throw reason;\n });\n });\n}\n\nfunction sequentialize(queue, promiseFactory) {\n return function () {\n var args = arguments;\n var that = this;\n return queue.add(function () {\n return promiseFactory.apply(that, args);\n });\n };\n}\n\n// uniq an array of strings, order not guaranteed\n// similar to underscore/lodash _.uniq\nfunction uniq(arr) {\n var theSet = new Set(arr);\n var result = new Array(theSet.size);\n var index = -1;\n theSet.forEach(function (value) {\n result[++index] = value;\n });\n return result;\n}\n\nfunction mapToKeysArray(map) {\n var result = new Array(map.size);\n var index = -1;\n map.forEach(function (value, key) {\n result[++index] = key;\n });\n return result;\n}\n\nfunction createBuiltInError(name) {\n var message = 'builtin ' + name +\n ' function requires map values to be numbers' +\n ' or number arrays';\n return new BuiltInError(message);\n}\n\nfunction sum(values) {\n var result = 0;\n for (var i = 0, len = values.length; i < len; i++) {\n var num = values[i];\n if (typeof num !== 'number') {\n if (Array.isArray(num)) {\n // lists of numbers are also allowed, sum them separately\n result = typeof result === 'number' ? [result] : result;\n for (var j = 0, jLen = num.length; j < jLen; j++) {\n var jNum = num[j];\n if (typeof jNum !== 'number') {\n throw createBuiltInError('_sum');\n } else if (typeof result[j] === 'undefined') {\n result.push(jNum);\n } else {\n result[j] += jNum;\n }\n }\n } else { // not array/number\n throw createBuiltInError('_sum');\n }\n } else if (typeof result === 'number') {\n result += num;\n } else { // add number to array\n result[0] += num;\n }\n }\n return result;\n}\n\nvar log = guardedConsole.bind(null, 'log');\nvar isArray = Array.isArray;\nvar toJSON = JSON.parse;\n\nfunction evalFunctionWithEval(func, emit) {\n return scopeEval(\n \"return (\" + func.replace(/;\\s*$/, \"\") + \");\",\n {\n emit,\n sum,\n log,\n isArray,\n toJSON\n }\n );\n}\n\n/*\n * Simple task queue to sequentialize actions. Assumes\n * callbacks will eventually fire (once).\n */\n\nclass TaskQueue$1 {\n constructor() {\n this.promise = Promise.resolve();\n }\n\n add(promiseFactory) {\n this.promise = this.promise\n // just recover\n .catch(() => { })\n .then(() => promiseFactory());\n return this.promise;\n }\n\n finish() {\n return this.promise;\n }\n}\n\nfunction stringify(input) {\n if (!input) {\n return 'undefined'; // backwards compat for empty reduce\n }\n // for backwards compat with mapreduce, functions/strings are stringified\n // as-is. everything else is JSON-stringified.\n switch (typeof input) {\n case 'function':\n // e.g. a mapreduce map\n return input.toString();\n case 'string':\n // e.g. a mapreduce built-in _reduce function\n return input.toString();\n default:\n // e.g. a JSON object in the case of mango queries\n return JSON.stringify(input);\n }\n}\n\n/* create a string signature for a view so we can cache it and uniq it */\nfunction createViewSignature(mapFun, reduceFun) {\n // the \"undefined\" part is for backwards compatibility\n return stringify(mapFun) + stringify(reduceFun) + 'undefined';\n}\n\nasync function createView(sourceDB, viewName, mapFun, reduceFun, temporary, localDocName) {\n const viewSignature = createViewSignature(mapFun, reduceFun);\n\n let cachedViews;\n if (!temporary) {\n // cache this to ensure we don't try to update the same view twice\n cachedViews = sourceDB._cachedViews = sourceDB._cachedViews || {};\n if (cachedViews[viewSignature]) {\n return cachedViews[viewSignature];\n }\n }\n\n const promiseForView = sourceDB.info().then(async function (info) {\n const depDbName = info.db_name + '-mrview-' +\n (temporary ? 'temp' : stringMd5(viewSignature));\n\n // save the view name in the source db so it can be cleaned up if necessary\n // (e.g. when the _design doc is deleted, remove all associated view data)\n function diffFunction(doc) {\n doc.views = doc.views || {};\n let fullViewName = viewName;\n if (fullViewName.indexOf('/') === -1) {\n fullViewName = viewName + '/' + viewName;\n }\n const depDbs = doc.views[fullViewName] = doc.views[fullViewName] || {};\n /* istanbul ignore if */\n if (depDbs[depDbName]) {\n return; // no update necessary\n }\n depDbs[depDbName] = true;\n return doc;\n }\n await upsert(sourceDB, '_local/' + localDocName, diffFunction);\n const res = await sourceDB.registerDependentDatabase(depDbName);\n const db = res.db;\n db.auto_compaction = true;\n const view = {\n name: depDbName,\n db,\n sourceDB,\n adapter: sourceDB.adapter,\n mapFun,\n reduceFun\n };\n\n let lastSeqDoc;\n try {\n lastSeqDoc = await view.db.get('_local/lastSeq');\n } catch (err) {\n /* istanbul ignore if */\n if (err.status !== 404) {\n throw err;\n }\n }\n\n view.seq = lastSeqDoc ? lastSeqDoc.seq : 0;\n if (cachedViews) {\n view.db.once('destroyed', function () {\n delete cachedViews[viewSignature];\n });\n }\n return view;\n });\n\n if (cachedViews) {\n cachedViews[viewSignature] = promiseForView;\n }\n return promiseForView;\n}\n\nconst persistentQueues = {};\nconst tempViewQueue = new TaskQueue$1();\nconst CHANGES_BATCH_SIZE$1 = 50;\n\nfunction parseViewName(name) {\n // can be either 'ddocname/viewname' or just 'viewname'\n // (where the ddoc name is the same)\n return name.indexOf('/') === -1 ? [name, name] : name.split('/');\n}\n\nfunction isGenOne(changes) {\n // only return true if the current change is 1-\n // and there are no other leafs\n return changes.length === 1 && /^1-/.test(changes[0].rev);\n}\n\nfunction emitError(db, e, data) {\n try {\n db.emit('error', e);\n } catch (err) {\n guardedConsole('error',\n 'The user\\'s map/reduce function threw an uncaught error.\\n' +\n 'You can debug this error by doing:\\n' +\n 'myDatabase.on(\\'error\\', function (err) { debugger; });\\n' +\n 'Please double-check your map/reduce function.');\n guardedConsole('error', e, data);\n }\n}\n\n/**\n * Returns an \"abstract\" mapreduce object of the form:\n *\n * {\n * query: queryFun,\n * viewCleanup: viewCleanupFun\n * }\n *\n * Arguments are:\n *\n * localDoc: string\n * This is for the local doc that gets saved in order to track the\n * \"dependent\" DBs and clean them up for viewCleanup. It should be\n * unique, so that indexer plugins don't collide with each other.\n * mapper: function (mapFunDef, emit)\n * Returns a map function based on the mapFunDef, which in the case of\n * normal map/reduce is just the de-stringified function, but may be\n * something else, such as an object in the case of pouchdb-find.\n * reducer: function (reduceFunDef)\n * Ditto, but for reducing. Modules don't have to support reducing\n * (e.g. pouchdb-find).\n * ddocValidator: function (ddoc, viewName)\n * Throws an error if the ddoc or viewName is not valid.\n * This could be a way to communicate to the user that the configuration for the\n * indexer is invalid.\n */\nfunction createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) {\n\n function tryMap(db, fun, doc) {\n // emit an event if there was an error thrown by a map function.\n // putting try/catches in a single function also avoids deoptimizations.\n try {\n fun(doc);\n } catch (e) {\n emitError(db, e, {fun, doc});\n }\n }\n\n function tryReduce(db, fun, keys, values, rereduce) {\n // same as above, but returning the result or an error. there are two separate\n // functions to avoid extra memory allocations since the tryCode() case is used\n // for custom map functions (common) vs this function, which is only used for\n // custom reduce functions (rare)\n try {\n return {output : fun(keys, values, rereduce)};\n } catch (e) {\n emitError(db, e, {fun, keys, values, rereduce});\n return {error: e};\n }\n }\n\n function sortByKeyThenValue(x, y) {\n const keyCompare = collate(x.key, y.key);\n return keyCompare !== 0 ? keyCompare : collate(x.value, y.value);\n }\n\n function sliceResults(results, limit, skip) {\n skip = skip || 0;\n if (typeof limit === 'number') {\n return results.slice(skip, limit + skip);\n } else if (skip > 0) {\n return results.slice(skip);\n }\n return results;\n }\n\n function rowToDocId(row) {\n const val = row.value;\n // Users can explicitly specify a joined doc _id, or it\n // defaults to the doc _id that emitted the key/value.\n const docId = (val && typeof val === 'object' && val._id) || row.id;\n return docId;\n }\n\n function readAttachmentsAsBlobOrBuffer(res) {\n for (const row of res.rows) {\n const atts = row.doc && row.doc._attachments;\n if (!atts) {\n continue;\n }\n for (const filename of Object.keys(atts)) {\n const att = atts[filename];\n atts[filename].data = b64ToBluffer(att.data, att.content_type);\n }\n }\n }\n\n function postprocessAttachments(opts) {\n return function (res) {\n if (opts.include_docs && opts.attachments && opts.binary) {\n readAttachmentsAsBlobOrBuffer(res);\n }\n return res;\n };\n }\n\n function addHttpParam(paramName, opts, params, asJson) {\n // add an http param from opts to params, optionally json-encoded\n let val = opts[paramName];\n if (typeof val !== 'undefined') {\n if (asJson) {\n val = encodeURIComponent(JSON.stringify(val));\n }\n params.push(paramName + '=' + val);\n }\n }\n\n function coerceInteger(integerCandidate) {\n if (typeof integerCandidate !== 'undefined') {\n const asNumber = Number(integerCandidate);\n // prevents e.g. '1foo' or '1.1' being coerced to 1\n if (!isNaN(asNumber) && asNumber === parseInt(integerCandidate, 10)) {\n return asNumber;\n } else {\n return integerCandidate;\n }\n }\n }\n\n function coerceOptions(opts) {\n opts.group_level = coerceInteger(opts.group_level);\n opts.limit = coerceInteger(opts.limit);\n opts.skip = coerceInteger(opts.skip);\n return opts;\n }\n\n function checkPositiveInteger(number) {\n if (number) {\n if (typeof number !== 'number') {\n return new QueryParseError(`Invalid value for integer: \"${number}\"`);\n }\n if (number < 0) {\n return new QueryParseError(`Invalid value for positive integer: \"${number}\"`);\n }\n }\n }\n\n function checkQueryParseError(options, fun) {\n const startkeyName = options.descending ? 'endkey' : 'startkey';\n const endkeyName = options.descending ? 'startkey' : 'endkey';\n\n if (typeof options[startkeyName] !== 'undefined' &&\n typeof options[endkeyName] !== 'undefined' &&\n collate(options[startkeyName], options[endkeyName]) > 0) {\n throw new QueryParseError('No rows can match your key range, ' +\n 'reverse your start_key and end_key or set {descending : true}');\n } else if (fun.reduce && options.reduce !== false) {\n if (options.include_docs) {\n throw new QueryParseError('{include_docs:true} is invalid for reduce');\n } else if (options.keys && options.keys.length > 1 &&\n !options.group && !options.group_level) {\n throw new QueryParseError('Multi-key fetches for reduce views must use ' +\n '{group: true}');\n }\n }\n for (const optionName of ['group_level', 'limit', 'skip']) {\n const error = checkPositiveInteger(options[optionName]);\n if (error) {\n throw error;\n }\n }\n }\n\n async function httpQuery(db, fun, opts) {\n // List of parameters to add to the PUT request\n let params = [];\n let body;\n let method = 'GET';\n let ok;\n\n // If opts.reduce exists and is defined, then add it to the list\n // of parameters.\n // If reduce=false then the results are that of only the map function\n // not the final result of map and reduce.\n addHttpParam('reduce', opts, params);\n addHttpParam('include_docs', opts, params);\n addHttpParam('attachments', opts, params);\n addHttpParam('limit', opts, params);\n addHttpParam('descending', opts, params);\n addHttpParam('group', opts, params);\n addHttpParam('group_level', opts, params);\n addHttpParam('skip', opts, params);\n addHttpParam('stale', opts, params);\n addHttpParam('conflicts', opts, params);\n addHttpParam('startkey', opts, params, true);\n addHttpParam('start_key', opts, params, true);\n addHttpParam('endkey', opts, params, true);\n addHttpParam('end_key', opts, params, true);\n addHttpParam('inclusive_end', opts, params);\n addHttpParam('key', opts, params, true);\n addHttpParam('update_seq', opts, params);\n\n // Format the list of parameters into a valid URI query string\n params = params.join('&');\n params = params === '' ? '' : '?' + params;\n\n // If keys are supplied, issue a POST to circumvent GET query string limits\n // see http://wiki.apache.org/couchdb/HTTP_view_API#Querying_Options\n if (typeof opts.keys !== 'undefined') {\n const MAX_URL_LENGTH = 2000;\n // according to http://stackoverflow.com/a/417184/680742,\n // the de facto URL length limit is 2000 characters\n\n const keysAsString = `keys=${encodeURIComponent(JSON.stringify(opts.keys))}`;\n if (keysAsString.length + params.length + 1 <= MAX_URL_LENGTH) {\n // If the keys are short enough, do a GET. we do this to work around\n // Safari not understanding 304s on POSTs (see pouchdb/pouchdb#1239)\n params += (params[0] === '?' ? '&' : '?') + keysAsString;\n } else {\n method = 'POST';\n if (typeof fun === 'string') {\n body = {keys: opts.keys};\n } else { // fun is {map : mapfun}, so append to this\n fun.keys = opts.keys;\n }\n }\n }\n\n // We are referencing a query defined in the design doc\n if (typeof fun === 'string') {\n const parts = parseViewName(fun);\n\n const response = await db.fetch('_design/' + parts[0] + '/_view/' + parts[1] + params, {\n headers: new h({'Content-Type': 'application/json'}),\n method,\n body: JSON.stringify(body)\n });\n ok = response.ok;\n // status = response.status;\n const result = await response.json();\n\n if (!ok) {\n result.status = response.status;\n throw generateErrorFromResponse(result);\n }\n\n // fail the entire request if the result contains an error\n for (const row of result.rows) {\n /* istanbul ignore if */\n if (row.value && row.value.error && row.value.error === \"builtin_reduce_error\") {\n throw new Error(row.reason);\n }\n }\n\n return new Promise(function (resolve) {\n resolve(result);\n }).then(postprocessAttachments(opts));\n }\n\n // We are using a temporary view, terrible for performance, good for testing\n body = body || {};\n for (const key of Object.keys(fun)) {\n if (Array.isArray(fun[key])) {\n body[key] = fun[key];\n } else {\n body[key] = fun[key].toString();\n }\n }\n\n const response = await db.fetch('_temp_view' + params, {\n headers: new h({'Content-Type': 'application/json'}),\n method: 'POST',\n body: JSON.stringify(body)\n });\n\n ok = response.ok;\n // status = response.status;\n const result = await response.json();\n if (!ok) {\n result.status = response.status;\n throw generateErrorFromResponse(result);\n }\n\n return new Promise(function (resolve) {\n resolve(result);\n }).then(postprocessAttachments(opts));\n }\n\n // custom adapters can define their own api._query\n // and override the default behavior\n /* istanbul ignore next */\n function customQuery(db, fun, opts) {\n return new Promise(function (resolve, reject) {\n db._query(fun, opts, function (err, res) {\n if (err) {\n return reject(err);\n }\n resolve(res);\n });\n });\n }\n\n // custom adapters can define their own api._viewCleanup\n // and override the default behavior\n /* istanbul ignore next */\n function customViewCleanup(db) {\n return new Promise(function (resolve, reject) {\n db._viewCleanup(function (err, res) {\n if (err) {\n return reject(err);\n }\n resolve(res);\n });\n });\n }\n\n function defaultsTo(value) {\n return function (reason) {\n /* istanbul ignore else */\n if (reason.status === 404) {\n return value;\n } else {\n throw reason;\n }\n };\n }\n\n // returns a promise for a list of docs to update, based on the input docId.\n // the order doesn't matter, because post-3.2.0, bulkDocs\n // is an atomic operation in all three adapters.\n async function getDocsToPersist(docId, view, docIdsToChangesAndEmits) {\n const metaDocId = '_local/doc_' + docId;\n const defaultMetaDoc = {_id: metaDocId, keys: []};\n const docData = docIdsToChangesAndEmits.get(docId);\n const indexableKeysToKeyValues = docData[0];\n const changes = docData[1];\n\n function getMetaDoc() {\n if (isGenOne(changes)) {\n // generation 1, so we can safely assume initial state\n // for performance reasons (avoids unnecessary GETs)\n return Promise.resolve(defaultMetaDoc);\n }\n return view.db.get(metaDocId).catch(defaultsTo(defaultMetaDoc));\n }\n\n function getKeyValueDocs(metaDoc) {\n if (!metaDoc.keys.length) {\n // no keys, no need for a lookup\n return Promise.resolve({rows: []});\n }\n return view.db.allDocs({\n keys: metaDoc.keys,\n include_docs: true\n });\n }\n\n function processKeyValueDocs(metaDoc, kvDocsRes) {\n const kvDocs = [];\n const oldKeys = new Set();\n\n for (const row of kvDocsRes.rows) {\n const doc = row.doc;\n if (!doc) { // deleted\n continue;\n }\n kvDocs.push(doc);\n oldKeys.add(doc._id);\n doc._deleted = !indexableKeysToKeyValues.has(doc._id);\n if (!doc._deleted) {\n const keyValue = indexableKeysToKeyValues.get(doc._id);\n if ('value' in keyValue) {\n doc.value = keyValue.value;\n }\n }\n }\n const newKeys = mapToKeysArray(indexableKeysToKeyValues);\n for (const key of newKeys) {\n if (!oldKeys.has(key)) {\n // new doc\n const kvDoc = {\n _id: key\n };\n const keyValue = indexableKeysToKeyValues.get(key);\n if ('value' in keyValue) {\n kvDoc.value = keyValue.value;\n }\n kvDocs.push(kvDoc);\n }\n }\n metaDoc.keys = uniq(newKeys.concat(metaDoc.keys));\n kvDocs.push(metaDoc);\n\n return kvDocs;\n }\n\n const metaDoc = await getMetaDoc();\n const keyValueDocs = await getKeyValueDocs(metaDoc);\n return processKeyValueDocs(metaDoc, keyValueDocs);\n }\n\n function updatePurgeSeq(view) {\n // with this approach, we just assume to have processed all missing purges and write the latest\n // purgeSeq into the _local/purgeSeq doc.\n return view.sourceDB.get('_local/purges').then(function (res) {\n const purgeSeq = res.purgeSeq;\n return view.db.get('_local/purgeSeq').then(function (res) {\n return res._rev;\n })\n .catch(defaultsTo(undefined))\n .then(function (rev$$1) {\n return view.db.put({\n _id: '_local/purgeSeq',\n _rev: rev$$1,\n purgeSeq,\n });\n });\n }).catch(function (err) {\n if (err.status !== 404) {\n throw err;\n }\n });\n }\n\n // updates all emitted key/value docs and metaDocs in the mrview database\n // for the given batch of documents from the source database\n function saveKeyValues(view, docIdsToChangesAndEmits, seq) {\n var seqDocId = '_local/lastSeq';\n return view.db.get(seqDocId)\n .catch(defaultsTo({_id: seqDocId, seq: 0}))\n .then(function (lastSeqDoc) {\n var docIds = mapToKeysArray(docIdsToChangesAndEmits);\n return Promise.all(docIds.map(function (docId) {\n return getDocsToPersist(docId, view, docIdsToChangesAndEmits);\n })).then(function (listOfDocsToPersist) {\n var docsToPersist = listOfDocsToPersist.flat();\n lastSeqDoc.seq = seq;\n docsToPersist.push(lastSeqDoc);\n // write all docs in a single operation, update the seq once\n return view.db.bulkDocs({docs : docsToPersist});\n })\n // TODO: this should be placed somewhere else, probably? we're querying both docs twice\n // (first time when getting the actual purges).\n .then(() => updatePurgeSeq(view));\n });\n }\n\n function getQueue(view) {\n const viewName = typeof view === 'string' ? view : view.name;\n let queue = persistentQueues[viewName];\n if (!queue) {\n queue = persistentQueues[viewName] = new TaskQueue$1();\n }\n return queue;\n }\n\n async function updateView(view, opts) {\n return sequentialize(getQueue(view), function () {\n return updateViewInQueue(view, opts);\n })();\n }\n\n async function updateViewInQueue(view, opts) {\n // bind the emit function once\n let mapResults;\n let doc;\n let taskId;\n\n function emit(key, value) {\n const output = {id: doc._id, key: normalizeKey(key)};\n // Don't explicitly store the value unless it's defined and non-null.\n // This saves on storage space, because often people don't use it.\n if (typeof value !== 'undefined' && value !== null) {\n output.value = normalizeKey(value);\n }\n mapResults.push(output);\n }\n\n const mapFun = mapper(view.mapFun, emit);\n\n let currentSeq = view.seq || 0;\n\n function createTask() {\n return view.sourceDB.info().then(function (info) {\n taskId = view.sourceDB.activeTasks.add({\n name: 'view_indexing',\n total_items: info.update_seq - currentSeq,\n });\n });\n }\n\n function processChange(docIdsToChangesAndEmits, seq) {\n return function () {\n return saveKeyValues(view, docIdsToChangesAndEmits, seq);\n };\n }\n\n let indexed_docs = 0;\n const progress = {\n view: view.name,\n indexed_docs\n };\n view.sourceDB.emit('indexing', progress);\n\n const queue = new TaskQueue$1();\n\n async function processNextBatch() {\n const response = await view.sourceDB.changes({\n return_docs: true,\n conflicts: true,\n include_docs: true,\n style: 'all_docs',\n since: currentSeq,\n limit: opts.changes_batch_size\n });\n const purges = await getRecentPurges();\n return processBatch(response, purges);\n }\n\n function getRecentPurges() {\n return view.db.get('_local/purgeSeq').then(function (res) {\n return res.purgeSeq;\n })\n .catch(defaultsTo(-1))\n .then(function (purgeSeq) {\n return view.sourceDB.get('_local/purges').then(function (res) {\n const recentPurges = res.purges.filter(function (purge, index) {\n return index > purgeSeq;\n }).map((purge) => purge.docId);\n\n const uniquePurges = recentPurges.filter(function (docId, index) {\n return recentPurges.indexOf(docId) === index;\n });\n\n return Promise.all(uniquePurges.map(function (docId) {\n return view.sourceDB.get(docId).then(function (doc) {\n return { docId, doc };\n })\n .catch(defaultsTo({ docId }));\n }));\n })\n .catch(defaultsTo([]));\n });\n }\n\n function processBatch(response, purges) {\n const results = response.results;\n if (!results.length && !purges.length) {\n return;\n }\n\n for (const purge of purges) {\n const index = results.findIndex(function (change) {\n return change.id === purge.docId;\n });\n if (index < 0) {\n // mimic a db.remove() on the changes feed\n const entry = {\n _id: purge.docId,\n doc: {\n _id: purge.docId,\n _deleted: 1,\n },\n changes: [],\n };\n\n if (purge.doc) {\n // update with new winning rev after purge\n entry.doc = purge.doc;\n entry.changes.push({ rev: purge.doc._rev });\n }\n\n results.push(entry);\n }\n }\n\n const docIdsToChangesAndEmits = createDocIdsToChangesAndEmits(results);\n\n queue.add(processChange(docIdsToChangesAndEmits, currentSeq));\n\n indexed_docs = indexed_docs + results.length;\n const progress = {\n view: view.name,\n last_seq: response.last_seq,\n results_count: results.length,\n indexed_docs\n };\n view.sourceDB.emit('indexing', progress);\n view.sourceDB.activeTasks.update(taskId, {completed_items: indexed_docs});\n\n if (results.length < opts.changes_batch_size) {\n return;\n }\n return processNextBatch();\n }\n\n function createDocIdsToChangesAndEmits(results) {\n const docIdsToChangesAndEmits = new Map();\n for (const change of results) {\n if (change.doc._id[0] !== '_') {\n mapResults = [];\n doc = change.doc;\n\n if (!doc._deleted) {\n tryMap(view.sourceDB, mapFun, doc);\n }\n mapResults.sort(sortByKeyThenValue);\n\n const indexableKeysToKeyValues = createIndexableKeysToKeyValues(mapResults);\n docIdsToChangesAndEmits.set(change.doc._id, [\n indexableKeysToKeyValues,\n change.changes\n ]);\n }\n currentSeq = change.seq;\n }\n return docIdsToChangesAndEmits;\n }\n\n function createIndexableKeysToKeyValues(mapResults) {\n const indexableKeysToKeyValues = new Map();\n let lastKey;\n for (let i = 0, len = mapResults.length; i < len; i++) {\n const emittedKeyValue = mapResults[i];\n const complexKey = [emittedKeyValue.key, emittedKeyValue.id];\n if (i > 0 && collate(emittedKeyValue.key, lastKey) === 0) {\n complexKey.push(i); // dup key+id, so make it unique\n }\n indexableKeysToKeyValues.set(toIndexableString(complexKey), emittedKeyValue);\n lastKey = emittedKeyValue.key;\n }\n return indexableKeysToKeyValues;\n }\n\n try {\n await createTask();\n await processNextBatch();\n await queue.finish();\n view.seq = currentSeq;\n view.sourceDB.activeTasks.remove(taskId);\n } catch (error) {\n view.sourceDB.activeTasks.remove(taskId, error);\n }\n }\n\n function reduceView(view, results, options) {\n if (options.group_level === 0) {\n delete options.group_level;\n }\n\n const shouldGroup = options.group || options.group_level;\n const reduceFun = reducer(view.reduceFun);\n const groups = [];\n const lvl = isNaN(options.group_level)\n ? Number.POSITIVE_INFINITY\n : options.group_level;\n\n for (const result of results) {\n const last = groups[groups.length - 1];\n let groupKey = shouldGroup ? result.key : null;\n\n // only set group_level for array keys\n if (shouldGroup && Array.isArray(groupKey)) {\n groupKey = groupKey.slice(0, lvl);\n }\n\n if (last && collate(last.groupKey, groupKey) === 0) {\n last.keys.push([result.key, result.id]);\n last.values.push(result.value);\n continue;\n }\n groups.push({\n keys: [[result.key, result.id]],\n values: [result.value],\n groupKey\n });\n }\n\n results = [];\n for (const group of groups) {\n const reduceTry = tryReduce(view.sourceDB, reduceFun, group.keys, group.values, false);\n if (reduceTry.error && reduceTry.error instanceof BuiltInError) {\n // CouchDB returns an error if a built-in errors out\n throw reduceTry.error;\n }\n results.push({\n // CouchDB just sets the value to null if a non-built-in errors out\n value: reduceTry.error ? null : reduceTry.output,\n key: group.groupKey\n });\n }\n // no total_rows/offset when reducing\n return { rows: sliceResults(results, options.limit, options.skip) };\n }\n\n function queryView(view, opts) {\n return sequentialize(getQueue(view), function () {\n return queryViewInQueue(view, opts);\n })();\n }\n\n async function queryViewInQueue(view, opts) {\n let totalRows;\n const shouldReduce = view.reduceFun && opts.reduce !== false;\n const skip = opts.skip || 0;\n if (typeof opts.keys !== 'undefined' && !opts.keys.length) {\n // equivalent query\n opts.limit = 0;\n delete opts.keys;\n }\n\n async function fetchFromView(viewOpts) {\n viewOpts.include_docs = true;\n const res = await view.db.allDocs(viewOpts);\n totalRows = res.total_rows;\n\n return res.rows.map(function (result) {\n // implicit migration - in older versions of PouchDB,\n // we explicitly stored the doc as {id: ..., key: ..., value: ...}\n // this is tested in a migration test\n /* istanbul ignore next */\n if ('value' in result.doc && typeof result.doc.value === 'object' &&\n result.doc.value !== null) {\n const keys = Object.keys(result.doc.value).sort();\n // this detection method is not perfect, but it's unlikely the user\n // emitted a value which was an object with these 3 exact keys\n const expectedKeys = ['id', 'key', 'value'];\n if (!(keys < expectedKeys || keys > expectedKeys)) {\n return result.doc.value;\n }\n }\n\n const parsedKeyAndDocId = parseIndexableString(result.doc._id);\n return {\n key: parsedKeyAndDocId[0],\n id: parsedKeyAndDocId[1],\n value: ('value' in result.doc ? result.doc.value : null)\n };\n });\n }\n\n async function onMapResultsReady(rows) {\n let finalResults;\n if (shouldReduce) {\n finalResults = reduceView(view, rows, opts);\n } else if (typeof opts.keys === 'undefined') {\n finalResults = {\n total_rows: totalRows,\n offset: skip,\n rows\n };\n } else {\n // support limit, skip for keys query\n finalResults = {\n total_rows: totalRows,\n offset: skip,\n rows: sliceResults(rows,opts.limit,opts.skip)\n };\n }\n /* istanbul ignore if */\n if (opts.update_seq) {\n finalResults.update_seq = view.seq;\n }\n if (opts.include_docs) {\n const docIds = uniq(rows.map(rowToDocId));\n\n const allDocsRes = await view.sourceDB.allDocs({\n keys: docIds,\n include_docs: true,\n conflicts: opts.conflicts,\n attachments: opts.attachments,\n binary: opts.binary\n });\n const docIdsToDocs = new Map();\n for (const row of allDocsRes.rows) {\n docIdsToDocs.set(row.id, row.doc);\n }\n for (const row of rows) {\n const docId = rowToDocId(row);\n const doc = docIdsToDocs.get(docId);\n if (doc) {\n row.doc = doc;\n }\n }\n }\n return finalResults;\n }\n\n if (typeof opts.keys !== 'undefined') {\n const keys = opts.keys;\n const fetchPromises = keys.map(function (key) {\n const viewOpts = {\n startkey : toIndexableString([key]),\n endkey : toIndexableString([key, {}])\n };\n /* istanbul ignore if */\n if (opts.update_seq) {\n viewOpts.update_seq = true;\n }\n return fetchFromView(viewOpts);\n });\n const result = await Promise.all(fetchPromises);\n const flattenedResult = result.flat();\n return onMapResultsReady(flattenedResult);\n } else { // normal query, no 'keys'\n const viewOpts = {\n descending : opts.descending\n };\n /* istanbul ignore if */\n if (opts.update_seq) {\n viewOpts.update_seq = true;\n }\n let startkey;\n let endkey;\n if ('start_key' in opts) {\n startkey = opts.start_key;\n }\n if ('startkey' in opts) {\n startkey = opts.startkey;\n }\n if ('end_key' in opts) {\n endkey = opts.end_key;\n }\n if ('endkey' in opts) {\n endkey = opts.endkey;\n }\n if (typeof startkey !== 'undefined') {\n viewOpts.startkey = opts.descending ?\n toIndexableString([startkey, {}]) :\n toIndexableString([startkey]);\n }\n if (typeof endkey !== 'undefined') {\n let inclusiveEnd = opts.inclusive_end !== false;\n if (opts.descending) {\n inclusiveEnd = !inclusiveEnd;\n }\n\n viewOpts.endkey = toIndexableString(\n inclusiveEnd ? [endkey, {}] : [endkey]);\n }\n if (typeof opts.key !== 'undefined') {\n const keyStart = toIndexableString([opts.key]);\n const keyEnd = toIndexableString([opts.key, {}]);\n if (viewOpts.descending) {\n viewOpts.endkey = keyStart;\n viewOpts.startkey = keyEnd;\n } else {\n viewOpts.startkey = keyStart;\n viewOpts.endkey = keyEnd;\n }\n }\n if (!shouldReduce) {\n if (typeof opts.limit === 'number') {\n viewOpts.limit = opts.limit;\n }\n viewOpts.skip = skip;\n }\n\n const result = await fetchFromView(viewOpts);\n return onMapResultsReady(result);\n }\n }\n\n async function httpViewCleanup(db) {\n const response = await db.fetch('_view_cleanup', {\n headers: new h({'Content-Type': 'application/json'}),\n method: 'POST'\n });\n return response.json();\n }\n\n async function localViewCleanup(db) {\n try {\n const metaDoc = await db.get('_local/' + localDocName);\n const docsToViews = new Map();\n\n for (const fullViewName of Object.keys(metaDoc.views)) {\n const parts = parseViewName(fullViewName);\n const designDocName = '_design/' + parts[0];\n const viewName = parts[1];\n let views = docsToViews.get(designDocName);\n if (!views) {\n views = new Set();\n docsToViews.set(designDocName, views);\n }\n views.add(viewName);\n }\n const opts = {\n keys : mapToKeysArray(docsToViews),\n include_docs : true\n };\n\n const res = await db.allDocs(opts);\n const viewsToStatus = {};\n for (const row of res.rows) {\n const ddocName = row.key.substring(8); // cuts off '_design/'\n for (const viewName of docsToViews.get(row.key)) {\n let fullViewName = ddocName + '/' + viewName;\n /* istanbul ignore if */\n if (!metaDoc.views[fullViewName]) {\n // new format, without slashes, to support PouchDB 2.2.0\n // migration test in pouchdb's browser.migration.js verifies this\n fullViewName = viewName;\n }\n const viewDBNames = Object.keys(metaDoc.views[fullViewName]);\n // design doc deleted, or view function nonexistent\n const statusIsGood = row.doc && row.doc.views &&\n row.doc.views[viewName];\n for (const viewDBName of viewDBNames) {\n viewsToStatus[viewDBName] = viewsToStatus[viewDBName] || statusIsGood;\n }\n }\n }\n\n const dbsToDelete = Object.keys(viewsToStatus)\n .filter(function (viewDBName) { return !viewsToStatus[viewDBName]; });\n\n const destroyPromises = dbsToDelete.map(function (viewDBName) {\n return sequentialize(getQueue(viewDBName), function () {\n return new db.constructor(viewDBName, db.__opts).destroy();\n })();\n });\n\n return Promise.all(destroyPromises).then(function () {\n return {ok: true};\n });\n } catch (err) {\n if (err.status === 404) {\n return {ok: true};\n } else {\n throw err;\n }\n }\n }\n\n async function queryPromised(db, fun, opts) {\n /* istanbul ignore next */\n if (typeof db._query === 'function') {\n return customQuery(db, fun, opts);\n }\n if (isRemote(db)) {\n return httpQuery(db, fun, opts);\n }\n\n const updateViewOpts = {\n changes_batch_size: db.__opts.view_update_changes_batch_size || CHANGES_BATCH_SIZE$1\n };\n\n if (typeof fun !== 'string') {\n // temp_view\n checkQueryParseError(opts, fun);\n\n tempViewQueue.add(async function () {\n const view = await createView(\n /* sourceDB */ db,\n /* viewName */ 'temp_view/temp_view',\n /* mapFun */ fun.map,\n /* reduceFun */ fun.reduce,\n /* temporary */ true,\n /* localDocName */ localDocName);\n\n return fin(updateView(view, updateViewOpts).then(\n function () { return queryView(view, opts); }),\n function () { return view.db.destroy(); }\n );\n });\n return tempViewQueue.finish();\n } else {\n // persistent view\n const fullViewName = fun;\n const parts = parseViewName(fullViewName);\n const designDocName = parts[0];\n const viewName = parts[1];\n\n const doc = await db.get('_design/' + designDocName);\n fun = doc.views && doc.views[viewName];\n\n if (!fun) {\n // basic validator; it's assumed that every subclass would want this\n throw new NotFoundError(`ddoc ${doc._id} has no view named ${viewName}`);\n }\n\n ddocValidator(doc, viewName);\n checkQueryParseError(opts, fun);\n\n const view = await createView(\n /* sourceDB */ db,\n /* viewName */ fullViewName,\n /* mapFun */ fun.map,\n /* reduceFun */ fun.reduce,\n /* temporary */ false,\n /* localDocName */ localDocName);\n\n if (opts.stale === 'ok' || opts.stale === 'update_after') {\n if (opts.stale === 'update_after') {\n nextTick(function () {\n updateView(view, updateViewOpts);\n });\n }\n return queryView(view, opts);\n } else { // stale not ok\n await updateView(view, updateViewOpts);\n return queryView(view, opts);\n }\n }\n }\n\n function abstractQuery(fun, opts, callback) {\n const db = this;\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n opts = opts ? coerceOptions(opts) : {};\n\n if (typeof fun === 'function') {\n fun = {map : fun};\n }\n\n const promise = Promise.resolve().then(function () {\n return queryPromised(db, fun, opts);\n });\n promisedCallback(promise, callback);\n return promise;\n }\n\n const abstractViewCleanup = callbackify(function () {\n const db = this;\n /* istanbul ignore next */\n if (typeof db._viewCleanup === 'function') {\n return customViewCleanup(db);\n }\n if (isRemote(db)) {\n return httpViewCleanup(db);\n }\n return localViewCleanup(db);\n });\n\n return {\n query: abstractQuery,\n viewCleanup: abstractViewCleanup\n };\n}\n\nvar builtInReduce = {\n _sum: function (keys, values) {\n return sum(values);\n },\n\n _count: function (keys, values) {\n return values.length;\n },\n\n _stats: function (keys, values) {\n // no need to implement rereduce=true, because Pouch\n // will never call it\n function sumsqr(values) {\n var _sumsqr = 0;\n for (var i = 0, len = values.length; i < len; i++) {\n var num = values[i];\n _sumsqr += (num * num);\n }\n return _sumsqr;\n }\n return {\n sum : sum(values),\n min : Math.min.apply(null, values),\n max : Math.max.apply(null, values),\n count : values.length,\n sumsqr : sumsqr(values)\n };\n }\n};\n\nfunction getBuiltIn(reduceFunString) {\n if (/^_sum/.test(reduceFunString)) {\n return builtInReduce._sum;\n } else if (/^_count/.test(reduceFunString)) {\n return builtInReduce._count;\n } else if (/^_stats/.test(reduceFunString)) {\n return builtInReduce._stats;\n } else if (/^_/.test(reduceFunString)) {\n throw new Error(reduceFunString + ' is not a supported reduce function.');\n }\n}\n\nfunction mapper(mapFun, emit) {\n // for temp_views one can use emit(doc, emit), see #38\n if (typeof mapFun === \"function\" && mapFun.length === 2) {\n var origMap = mapFun;\n return function (doc) {\n return origMap(doc, emit);\n };\n } else {\n return evalFunctionWithEval(mapFun.toString(), emit);\n }\n}\n\nfunction reducer(reduceFun) {\n var reduceFunString = reduceFun.toString();\n var builtIn = getBuiltIn(reduceFunString);\n if (builtIn) {\n return builtIn;\n } else {\n return evalFunctionWithEval(reduceFunString);\n }\n}\n\nfunction ddocValidator(ddoc, viewName) {\n var fun = ddoc.views && ddoc.views[viewName];\n if (typeof fun.map !== 'string') {\n throw new NotFoundError('ddoc ' + ddoc._id + ' has no string view named ' +\n viewName + ', instead found object of type: ' + typeof fun.map);\n }\n}\n\nvar localDocName = 'mrviews';\nvar abstract = createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator);\n\nfunction query(fun, opts, callback) {\n return abstract.query.call(this, fun, opts, callback);\n}\n\nfunction viewCleanup(callback) {\n return abstract.viewCleanup.call(this, callback);\n}\n\nvar mapreduce = {\n query,\n viewCleanup\n};\n\nfunction fileHasChanged(localDoc, remoteDoc, filename) {\n return !localDoc._attachments ||\n !localDoc._attachments[filename] ||\n localDoc._attachments[filename].digest !== remoteDoc._attachments[filename].digest;\n}\n\nfunction getDocAttachments(db, doc) {\n var filenames = Object.keys(doc._attachments);\n return Promise.all(filenames.map(function (filename) {\n return db.getAttachment(doc._id, filename, {rev: doc._rev});\n }));\n}\n\nfunction getDocAttachmentsFromTargetOrSource(target, src, doc) {\n var doCheckForLocalAttachments = isRemote(src) && !isRemote(target);\n var filenames = Object.keys(doc._attachments);\n\n if (!doCheckForLocalAttachments) {\n return getDocAttachments(src, doc);\n }\n\n return target.get(doc._id).then(function (localDoc) {\n return Promise.all(filenames.map(function (filename) {\n if (fileHasChanged(localDoc, doc, filename)) {\n return src.getAttachment(doc._id, filename);\n }\n\n return target.getAttachment(localDoc._id, filename);\n }));\n }).catch(function (error) {\n /* istanbul ignore if */\n if (error.status !== 404) {\n throw error;\n }\n\n return getDocAttachments(src, doc);\n });\n}\n\nfunction createBulkGetOpts(diffs) {\n var requests = [];\n Object.keys(diffs).forEach(function (id) {\n var missingRevs = diffs[id].missing;\n missingRevs.forEach(function (missingRev) {\n requests.push({\n id,\n rev: missingRev\n });\n });\n });\n\n return {\n docs: requests,\n revs: true,\n latest: true\n };\n}\n\n//\n// Fetch all the documents from the src as described in the \"diffs\",\n// which is a mapping of docs IDs to revisions. If the state ever\n// changes to \"cancelled\", then the returned promise will be rejected.\n// Else it will be resolved with a list of fetched documents.\n//\nfunction getDocs(src, target, diffs, state) {\n diffs = clone(diffs); // we do not need to modify this\n\n var resultDocs = [],\n ok = true;\n\n function getAllDocs() {\n\n var bulkGetOpts = createBulkGetOpts(diffs);\n\n if (!bulkGetOpts.docs.length) { // optimization: skip empty requests\n return;\n }\n\n return src.bulkGet(bulkGetOpts).then(function (bulkGetResponse) {\n /* istanbul ignore if */\n if (state.cancelled) {\n throw new Error('cancelled');\n }\n return Promise.all(bulkGetResponse.results.map(function (bulkGetInfo) {\n return Promise.all(bulkGetInfo.docs.map(function (doc) {\n var remoteDoc = doc.ok;\n\n if (doc.error) {\n // when AUTO_COMPACTION is set, docs can be returned which look\n // like this: {\"missing\":\"1-7c3ac256b693c462af8442f992b83696\"}\n ok = false;\n }\n\n if (!remoteDoc || !remoteDoc._attachments) {\n return remoteDoc;\n }\n\n return getDocAttachmentsFromTargetOrSource(target, src, remoteDoc).then((attachments) => {\n var filenames = Object.keys(remoteDoc._attachments);\n attachments.forEach(function (attachment, i) {\n var att = remoteDoc._attachments[filenames[i]];\n delete att.stub;\n delete att.length;\n att.data = attachment;\n });\n\n return remoteDoc;\n });\n }));\n }))\n\n .then(function (results) {\n resultDocs = resultDocs.concat(results.flat().filter(Boolean));\n });\n });\n }\n\n function returnResult() {\n return { ok, docs:resultDocs };\n }\n\n return Promise.resolve()\n .then(getAllDocs)\n .then(returnResult);\n}\n\nvar CHECKPOINT_VERSION = 1;\nvar REPLICATOR = \"pouchdb\";\n// This is an arbitrary number to limit the\n// amount of replication history we save in the checkpoint.\n// If we save too much, the checkpoint docs will become very big,\n// if we save fewer, we'll run a greater risk of having to\n// read all the changes from 0 when checkpoint PUTs fail\n// CouchDB 2.0 has a more involved history pruning,\n// but let's go for the simple version for now.\nvar CHECKPOINT_HISTORY_SIZE = 5;\nvar LOWEST_SEQ = 0;\n\nfunction updateCheckpoint(db, id, checkpoint, session, returnValue) {\n return db.get(id).catch(function (err) {\n if (err.status === 404) {\n if (db.adapter === 'http' || db.adapter === 'https') {\n explainError(\n 404, 'PouchDB is just checking if a remote checkpoint exists.'\n );\n }\n return {\n session_id: session,\n _id: id,\n history: [],\n replicator: REPLICATOR,\n version: CHECKPOINT_VERSION\n };\n }\n throw err;\n }).then(function (doc) {\n if (returnValue.cancelled) {\n return;\n }\n\n // if the checkpoint has not changed, do not update\n if (doc.last_seq === checkpoint) {\n return;\n }\n\n // Filter out current entry for this replication\n doc.history = (doc.history || []).filter(function (item) {\n return item.session_id !== session;\n });\n\n // Add the latest checkpoint to history\n doc.history.unshift({\n last_seq: checkpoint,\n session_id: session\n });\n\n // Just take the last pieces in history, to\n // avoid really big checkpoint docs.\n // see comment on history size above\n doc.history = doc.history.slice(0, CHECKPOINT_HISTORY_SIZE);\n\n doc.version = CHECKPOINT_VERSION;\n doc.replicator = REPLICATOR;\n\n doc.session_id = session;\n doc.last_seq = checkpoint;\n\n return db.put(doc).catch(function (err) {\n if (err.status === 409) {\n // retry; someone is trying to write a checkpoint simultaneously\n return updateCheckpoint(db, id, checkpoint, session, returnValue);\n }\n throw err;\n });\n });\n}\n\nclass CheckpointerInternal {\n constructor(src, target, id, returnValue, opts = {\n writeSourceCheckpoint: true,\n writeTargetCheckpoint: true,\n }) {\n this.src = src;\n this.target = target;\n this.id = id;\n this.returnValue = returnValue;\n this.opts = opts;\n\n if (typeof opts.writeSourceCheckpoint === \"undefined\") {\n opts.writeSourceCheckpoint = true;\n }\n\n if (typeof opts.writeTargetCheckpoint === \"undefined\") {\n opts.writeTargetCheckpoint = true;\n }\n }\n\n writeCheckpoint(checkpoint, session) {\n var self = this;\n return this.updateTarget(checkpoint, session).then(function () {\n return self.updateSource(checkpoint, session);\n });\n }\n\n updateTarget(checkpoint, session) {\n if (this.opts.writeTargetCheckpoint) {\n return updateCheckpoint(this.target, this.id, checkpoint,\n session, this.returnValue);\n } else {\n return Promise.resolve(true);\n }\n }\n\n updateSource(checkpoint, session) {\n if (this.opts.writeSourceCheckpoint) {\n var self = this;\n return updateCheckpoint(this.src, this.id, checkpoint,\n session, this.returnValue)\n .catch(function (err) {\n if (isForbiddenError(err)) {\n self.opts.writeSourceCheckpoint = false;\n return true;\n }\n throw err;\n });\n } else {\n return Promise.resolve(true);\n }\n }\n\n getCheckpoint() {\n var self = this;\n\n if (!self.opts.writeSourceCheckpoint && !self.opts.writeTargetCheckpoint) {\n return Promise.resolve(LOWEST_SEQ);\n }\n\n if (self.opts && self.opts.writeSourceCheckpoint && !self.opts.writeTargetCheckpoint) {\n return self.src.get(self.id).then(function (sourceDoc) {\n return sourceDoc.last_seq || LOWEST_SEQ;\n }).catch(function (err) {\n /* istanbul ignore if */\n if (err.status !== 404) {\n throw err;\n }\n return LOWEST_SEQ;\n });\n }\n\n return self.target.get(self.id).then(function (targetDoc) {\n if (self.opts && self.opts.writeTargetCheckpoint && !self.opts.writeSourceCheckpoint) {\n return targetDoc.last_seq || LOWEST_SEQ;\n }\n\n return self.src.get(self.id).then(function (sourceDoc) {\n // Since we can't migrate an old version doc to a new one\n // (no session id), we just go with the lowest seq in this case\n /* istanbul ignore if */\n if (targetDoc.version !== sourceDoc.version) {\n return LOWEST_SEQ;\n }\n\n var version;\n if (targetDoc.version) {\n version = targetDoc.version.toString();\n } else {\n version = \"undefined\";\n }\n\n if (version in comparisons) {\n return comparisons[version](targetDoc, sourceDoc);\n }\n /* istanbul ignore next */\n return LOWEST_SEQ;\n }, function (err) {\n if (err.status === 404 && targetDoc.last_seq) {\n return self.src.put({\n _id: self.id,\n last_seq: LOWEST_SEQ\n }).then(function () {\n return LOWEST_SEQ;\n }, function (err) {\n if (isForbiddenError(err)) {\n self.opts.writeSourceCheckpoint = false;\n return targetDoc.last_seq;\n }\n /* istanbul ignore next */\n return LOWEST_SEQ;\n });\n }\n throw err;\n });\n }).catch(function (err) {\n if (err.status !== 404) {\n throw err;\n }\n return LOWEST_SEQ;\n });\n }\n}\n\nvar comparisons = {\n \"undefined\": function (targetDoc, sourceDoc) {\n // This is the previous comparison function\n if (collate(targetDoc.last_seq, sourceDoc.last_seq) === 0) {\n return sourceDoc.last_seq;\n }\n /* istanbul ignore next */\n return 0;\n },\n \"1\": function (targetDoc, sourceDoc) {\n // This is the comparison function ported from CouchDB\n return compareReplicationLogs(sourceDoc, targetDoc).last_seq;\n }\n};\n\n// This checkpoint comparison is ported from CouchDBs source\n// they come from here:\n// https://github.com/apache/couchdb-couch-replicator/blob/master/src/couch_replicator.erl#L863-L906\n\nfunction compareReplicationLogs(srcDoc, tgtDoc) {\n if (srcDoc.session_id === tgtDoc.session_id) {\n return {\n last_seq: srcDoc.last_seq,\n history: srcDoc.history\n };\n }\n\n return compareReplicationHistory(srcDoc.history, tgtDoc.history);\n}\n\nfunction compareReplicationHistory(sourceHistory, targetHistory) {\n // the erlang loop via function arguments is not so easy to repeat in JS\n // therefore, doing this as recursion\n var S = sourceHistory[0];\n var sourceRest = sourceHistory.slice(1);\n var T = targetHistory[0];\n var targetRest = targetHistory.slice(1);\n\n if (!S || targetHistory.length === 0) {\n return {\n last_seq: LOWEST_SEQ,\n history: []\n };\n }\n\n var sourceId = S.session_id;\n /* istanbul ignore if */\n if (hasSessionId(sourceId, targetHistory)) {\n return {\n last_seq: S.last_seq,\n history: sourceHistory\n };\n }\n\n var targetId = T.session_id;\n if (hasSessionId(targetId, sourceRest)) {\n return {\n last_seq: T.last_seq,\n history: targetRest\n };\n }\n\n return compareReplicationHistory(sourceRest, targetRest);\n}\n\nfunction hasSessionId(sessionId, history) {\n var props = history[0];\n var rest = history.slice(1);\n\n if (!sessionId || history.length === 0) {\n return false;\n }\n\n if (sessionId === props.session_id) {\n return true;\n }\n\n return hasSessionId(sessionId, rest);\n}\n\nfunction isForbiddenError(err) {\n return typeof err.status === 'number' && Math.floor(err.status / 100) === 4;\n}\n\nfunction Checkpointer(src, target, id, returnValue, opts) {\n if (!(this instanceof CheckpointerInternal)) {\n return new CheckpointerInternal(src, target, id, returnValue, opts);\n }\n return Checkpointer;\n}\n\nvar STARTING_BACK_OFF = 0;\n\nfunction backOff(opts, returnValue, error, callback) {\n if (opts.retry === false) {\n returnValue.emit('error', error);\n returnValue.removeAllListeners();\n return;\n }\n /* istanbul ignore if */\n if (typeof opts.back_off_function !== 'function') {\n opts.back_off_function = defaultBackOff;\n }\n returnValue.emit('requestError', error);\n if (returnValue.state === 'active' || returnValue.state === 'pending') {\n returnValue.emit('paused', error);\n returnValue.state = 'stopped';\n var backOffSet = function backoffTimeSet() {\n opts.current_back_off = STARTING_BACK_OFF;\n };\n var removeBackOffSetter = function removeBackOffTimeSet() {\n returnValue.removeListener('active', backOffSet);\n };\n returnValue.once('paused', removeBackOffSetter);\n returnValue.once('active', backOffSet);\n }\n\n opts.current_back_off = opts.current_back_off || STARTING_BACK_OFF;\n opts.current_back_off = opts.back_off_function(opts.current_back_off);\n setTimeout(callback, opts.current_back_off);\n}\n\nfunction sortObjectPropertiesByKey(queryParams) {\n return Object.keys(queryParams).sort(collate).reduce(function (result, key) {\n result[key] = queryParams[key];\n return result;\n }, {});\n}\n\n// Generate a unique id particular to this replication.\n// Not guaranteed to align perfectly with CouchDB's rep ids.\nfunction generateReplicationId(src, target, opts) {\n var docIds = opts.doc_ids ? opts.doc_ids.sort(collate) : '';\n var filterFun = opts.filter ? opts.filter.toString() : '';\n var queryParams = '';\n var filterViewName = '';\n var selector = '';\n\n // possibility for checkpoints to be lost here as behaviour of\n // JSON.stringify is not stable (see #6226)\n /* istanbul ignore if */\n if (opts.selector) {\n selector = JSON.stringify(opts.selector);\n }\n\n if (opts.filter && opts.query_params) {\n queryParams = JSON.stringify(sortObjectPropertiesByKey(opts.query_params));\n }\n\n if (opts.filter && opts.filter === '_view') {\n filterViewName = opts.view.toString();\n }\n\n return Promise.all([src.id(), target.id()]).then(function (res) {\n var queryData = res[0] + res[1] + filterFun + filterViewName +\n queryParams + docIds + selector;\n return new Promise(function (resolve) {\n binaryMd5(queryData, resolve);\n });\n }).then(function (md5sum) {\n // can't use straight-up md5 alphabet, because\n // the char '/' is interpreted as being for attachments,\n // and + is also not url-safe\n md5sum = md5sum.replace(/\\//g, '.').replace(/\\+/g, '_');\n return '_local/' + md5sum;\n });\n}\n\nfunction replicate(src, target, opts, returnValue, result) {\n var batches = []; // list of batches to be processed\n var currentBatch; // the batch currently being processed\n var pendingBatch = {\n seq: 0,\n changes: [],\n docs: []\n }; // next batch, not yet ready to be processed\n var writingCheckpoint = false; // true while checkpoint is being written\n var changesCompleted = false; // true when all changes received\n var replicationCompleted = false; // true when replication has completed\n // initial_last_seq is the state of the source db before\n // replication started, and it is _not_ updated during\n // replication or used anywhere else, as opposed to last_seq\n var initial_last_seq = 0;\n var last_seq = 0;\n var continuous = opts.continuous || opts.live || false;\n var batch_size = opts.batch_size || 100;\n var batches_limit = opts.batches_limit || 10;\n var style = opts.style || 'all_docs';\n var changesPending = false; // true while src.changes is running\n var doc_ids = opts.doc_ids;\n var selector = opts.selector;\n var repId;\n var checkpointer;\n var changedDocs = [];\n // Like couchdb, every replication gets a unique session id\n var session = uuid();\n var taskId;\n\n result = result || {\n ok: true,\n start_time: new Date().toISOString(),\n docs_read: 0,\n docs_written: 0,\n doc_write_failures: 0,\n errors: []\n };\n\n var changesOpts = {};\n returnValue.ready(src, target);\n\n function initCheckpointer() {\n if (checkpointer) {\n return Promise.resolve();\n }\n return generateReplicationId(src, target, opts).then(function (res) {\n repId = res;\n\n var checkpointOpts = {};\n if (opts.checkpoint === false) {\n checkpointOpts = { writeSourceCheckpoint: false, writeTargetCheckpoint: false };\n } else if (opts.checkpoint === 'source') {\n checkpointOpts = { writeSourceCheckpoint: true, writeTargetCheckpoint: false };\n } else if (opts.checkpoint === 'target') {\n checkpointOpts = { writeSourceCheckpoint: false, writeTargetCheckpoint: true };\n } else {\n checkpointOpts = { writeSourceCheckpoint: true, writeTargetCheckpoint: true };\n }\n\n checkpointer = new Checkpointer(src, target, repId, returnValue, checkpointOpts);\n });\n }\n\n function writeDocs() {\n changedDocs = [];\n\n if (currentBatch.docs.length === 0) {\n return;\n }\n var docs = currentBatch.docs;\n var bulkOpts = {timeout: opts.timeout};\n return target.bulkDocs({docs, new_edits: false}, bulkOpts).then(function (res) {\n /* istanbul ignore if */\n if (returnValue.cancelled) {\n completeReplication();\n throw new Error('cancelled');\n }\n\n // `res` doesn't include full documents (which live in `docs`), so we create a map of\n // (id -> error), and check for errors while iterating over `docs`\n var errorsById = Object.create(null);\n res.forEach(function (res) {\n if (res.error) {\n errorsById[res.id] = res;\n }\n });\n\n var errorsNo = Object.keys(errorsById).length;\n result.doc_write_failures += errorsNo;\n result.docs_written += docs.length - errorsNo;\n\n docs.forEach(function (doc) {\n var error = errorsById[doc._id];\n if (error) {\n result.errors.push(error);\n // Normalize error name. i.e. 'Unauthorized' -> 'unauthorized' (eg Sync Gateway)\n var errorName = (error.name || '').toLowerCase();\n if (errorName === 'unauthorized' || errorName === 'forbidden') {\n returnValue.emit('denied', clone(error));\n } else {\n throw error;\n }\n } else {\n changedDocs.push(doc);\n }\n });\n\n }, function (err) {\n result.doc_write_failures += docs.length;\n throw err;\n });\n }\n\n function finishBatch() {\n if (currentBatch.error) {\n throw new Error('There was a problem getting docs.');\n }\n result.last_seq = last_seq = currentBatch.seq;\n var outResult = clone(result);\n if (changedDocs.length) {\n outResult.docs = changedDocs;\n // Attach 'pending' property if server supports it (CouchDB 2.0+)\n /* istanbul ignore if */\n if (typeof currentBatch.pending === 'number') {\n outResult.pending = currentBatch.pending;\n delete currentBatch.pending;\n }\n returnValue.emit('change', outResult);\n }\n writingCheckpoint = true;\n\n src.info().then(function (info) {\n var task = src.activeTasks.get(taskId);\n if (!currentBatch || !task) {\n return;\n }\n\n var completed = task.completed_items || 0;\n var total_items = parseInt(info.update_seq, 10) - parseInt(initial_last_seq, 10);\n src.activeTasks.update(taskId, {\n completed_items: completed + currentBatch.changes.length,\n total_items\n });\n });\n\n return checkpointer.writeCheckpoint(currentBatch.seq,\n session).then(function () {\n returnValue.emit('checkpoint', { 'checkpoint': currentBatch.seq });\n writingCheckpoint = false;\n /* istanbul ignore if */\n if (returnValue.cancelled) {\n completeReplication();\n throw new Error('cancelled');\n }\n currentBatch = undefined;\n getChanges();\n }).catch(function (err) {\n onCheckpointError(err);\n throw err;\n });\n }\n\n function getDiffs() {\n var diff = {};\n currentBatch.changes.forEach(function (change) {\n returnValue.emit('checkpoint', { 'revs_diff': change });\n // Couchbase Sync Gateway emits these, but we can ignore them\n /* istanbul ignore if */\n if (change.id === \"_user/\") {\n return;\n }\n diff[change.id] = change.changes.map(function (x) {\n return x.rev;\n });\n });\n return target.revsDiff(diff).then(function (diffs) {\n /* istanbul ignore if */\n if (returnValue.cancelled) {\n completeReplication();\n throw new Error('cancelled');\n }\n // currentBatch.diffs elements are deleted as the documents are written\n currentBatch.diffs = diffs;\n });\n }\n\n function getBatchDocs() {\n return getDocs(src, target, currentBatch.diffs, returnValue).then(function (got) {\n currentBatch.error = !got.ok;\n got.docs.forEach(function (doc) {\n delete currentBatch.diffs[doc._id];\n result.docs_read++;\n currentBatch.docs.push(doc);\n });\n });\n }\n\n function startNextBatch() {\n if (returnValue.cancelled || currentBatch) {\n return;\n }\n if (batches.length === 0) {\n processPendingBatch(true);\n return;\n }\n currentBatch = batches.shift();\n returnValue.emit('checkpoint', { 'start_next_batch': currentBatch.seq });\n getDiffs()\n .then(getBatchDocs)\n .then(writeDocs)\n .then(finishBatch)\n .then(startNextBatch)\n .catch(function (err) {\n abortReplication('batch processing terminated with error', err);\n });\n }\n\n\n function processPendingBatch(immediate) {\n if (pendingBatch.changes.length === 0) {\n if (batches.length === 0 && !currentBatch) {\n if ((continuous && changesOpts.live) || changesCompleted) {\n returnValue.state = 'pending';\n returnValue.emit('paused');\n }\n if (changesCompleted) {\n completeReplication();\n }\n }\n return;\n }\n if (\n immediate ||\n changesCompleted ||\n pendingBatch.changes.length >= batch_size\n ) {\n batches.push(pendingBatch);\n pendingBatch = {\n seq: 0,\n changes: [],\n docs: []\n };\n if (returnValue.state === 'pending' || returnValue.state === 'stopped') {\n returnValue.state = 'active';\n returnValue.emit('active');\n }\n startNextBatch();\n }\n }\n\n\n function abortReplication(reason, err) {\n if (replicationCompleted) {\n return;\n }\n if (!err.message) {\n err.message = reason;\n }\n result.ok = false;\n result.status = 'aborting';\n batches = [];\n pendingBatch = {\n seq: 0,\n changes: [],\n docs: []\n };\n completeReplication(err);\n }\n\n\n function completeReplication(fatalError) {\n if (replicationCompleted) {\n return;\n }\n /* istanbul ignore if */\n if (returnValue.cancelled) {\n result.status = 'cancelled';\n if (writingCheckpoint) {\n return;\n }\n }\n result.status = result.status || 'complete';\n result.end_time = new Date().toISOString();\n result.last_seq = last_seq;\n replicationCompleted = true;\n\n src.activeTasks.remove(taskId, fatalError);\n\n if (fatalError) {\n // need to extend the error because Firefox considers \".result\" read-only\n fatalError = createError(fatalError);\n fatalError.result = result;\n\n // Normalize error name. i.e. 'Unauthorized' -> 'unauthorized' (eg Sync Gateway)\n var errorName = (fatalError.name || '').toLowerCase();\n if (errorName === 'unauthorized' || errorName === 'forbidden') {\n returnValue.emit('error', fatalError);\n returnValue.removeAllListeners();\n } else {\n backOff(opts, returnValue, fatalError, function () {\n replicate(src, target, opts, returnValue);\n });\n }\n } else {\n returnValue.emit('complete', result);\n returnValue.removeAllListeners();\n }\n }\n\n function onChange(change, pending, lastSeq) {\n /* istanbul ignore if */\n if (returnValue.cancelled) {\n return completeReplication();\n }\n // Attach 'pending' property if server supports it (CouchDB 2.0+)\n /* istanbul ignore if */\n if (typeof pending === 'number') {\n pendingBatch.pending = pending;\n }\n\n var filter = filterChange(opts)(change);\n if (!filter) {\n // update processed items count by 1\n var task = src.activeTasks.get(taskId);\n if (task) {\n // we can assume that task exists here? shouldn't be deleted by here.\n var completed = task.completed_items || 0;\n src.activeTasks.update(taskId, {completed_items: ++completed});\n }\n return;\n }\n pendingBatch.seq = change.seq || lastSeq;\n pendingBatch.changes.push(change);\n returnValue.emit('checkpoint', { 'pending_batch': pendingBatch.seq });\n nextTick(function () {\n processPendingBatch(batches.length === 0 && changesOpts.live);\n });\n }\n\n\n function onChangesComplete(changes) {\n changesPending = false;\n /* istanbul ignore if */\n if (returnValue.cancelled) {\n return completeReplication();\n }\n\n // if no results were returned then we're done,\n // else fetch more\n if (changes.results.length > 0) {\n changesOpts.since = changes.results[changes.results.length - 1].seq;\n getChanges();\n processPendingBatch(true);\n } else {\n\n var complete = function () {\n if (continuous) {\n changesOpts.live = true;\n getChanges();\n } else {\n changesCompleted = true;\n }\n processPendingBatch(true);\n };\n\n // update the checkpoint so we start from the right seq next time\n if (!currentBatch && changes.results.length === 0) {\n writingCheckpoint = true;\n checkpointer.writeCheckpoint(changes.last_seq,\n session).then(function () {\n writingCheckpoint = false;\n result.last_seq = last_seq = changes.last_seq;\n if (returnValue.cancelled) {\n completeReplication();\n throw new Error('cancelled');\n } else {\n complete();\n }\n })\n .catch(onCheckpointError);\n } else {\n complete();\n }\n }\n }\n\n\n function onChangesError(err) {\n changesPending = false;\n /* istanbul ignore if */\n if (returnValue.cancelled) {\n return completeReplication();\n }\n abortReplication('changes rejected', err);\n }\n\n\n function getChanges() {\n if (!(\n !changesPending &&\n !changesCompleted &&\n batches.length < batches_limit\n )) {\n return;\n }\n changesPending = true;\n function abortChanges() {\n changes.cancel();\n }\n function removeListener() {\n returnValue.removeListener('cancel', abortChanges);\n }\n\n if (returnValue._changes) { // remove old changes() and listeners\n returnValue.removeListener('cancel', returnValue._abortChanges);\n returnValue._changes.cancel();\n }\n returnValue.once('cancel', abortChanges);\n\n var changes = src.changes(changesOpts)\n .on('change', onChange);\n changes.then(removeListener, removeListener);\n changes.then(onChangesComplete)\n .catch(onChangesError);\n\n if (opts.retry) {\n // save for later so we can cancel if necessary\n returnValue._changes = changes;\n returnValue._abortChanges = abortChanges;\n }\n }\n\n function createTask(checkpoint) {\n return src.info().then(function (info) {\n var total_items = typeof opts.since === 'undefined' ?\n parseInt(info.update_seq, 10) - parseInt(checkpoint, 10) :\n parseInt(info.update_seq, 10);\n\n taskId = src.activeTasks.add({\n name: `${continuous ? 'continuous ' : ''}replication from ${info.db_name}` ,\n total_items,\n });\n\n return checkpoint;\n });\n }\n\n function startChanges() {\n initCheckpointer().then(function () {\n /* istanbul ignore if */\n if (returnValue.cancelled) {\n completeReplication();\n return;\n }\n return checkpointer.getCheckpoint().then(createTask).then(function (checkpoint) {\n last_seq = checkpoint;\n initial_last_seq = checkpoint;\n changesOpts = {\n since: last_seq,\n limit: batch_size,\n batch_size,\n style,\n doc_ids,\n selector,\n return_docs: true // required so we know when we're done\n };\n if (opts.filter) {\n if (typeof opts.filter !== 'string') {\n // required for the client-side filter in onChange\n changesOpts.include_docs = true;\n } else { // ddoc filter\n changesOpts.filter = opts.filter;\n }\n }\n if ('heartbeat' in opts) {\n changesOpts.heartbeat = opts.heartbeat;\n }\n if ('timeout' in opts) {\n changesOpts.timeout = opts.timeout;\n }\n if (opts.query_params) {\n changesOpts.query_params = opts.query_params;\n }\n if (opts.view) {\n changesOpts.view = opts.view;\n }\n getChanges();\n });\n }).catch(function (err) {\n abortReplication('getCheckpoint rejected with ', err);\n });\n }\n\n /* istanbul ignore next */\n function onCheckpointError(err) {\n writingCheckpoint = false;\n abortReplication('writeCheckpoint completed with error', err);\n }\n\n /* istanbul ignore if */\n if (returnValue.cancelled) { // cancelled immediately\n completeReplication();\n return;\n }\n\n if (!returnValue._addedListeners) {\n returnValue.once('cancel', completeReplication);\n\n if (typeof opts.complete === 'function') {\n returnValue.once('error', opts.complete);\n returnValue.once('complete', function (result) {\n opts.complete(null, result);\n });\n }\n returnValue._addedListeners = true;\n }\n\n if (typeof opts.since === 'undefined') {\n startChanges();\n } else {\n initCheckpointer().then(function () {\n writingCheckpoint = true;\n return checkpointer.writeCheckpoint(opts.since, session);\n }).then(function () {\n writingCheckpoint = false;\n /* istanbul ignore if */\n if (returnValue.cancelled) {\n completeReplication();\n return;\n }\n last_seq = opts.since;\n startChanges();\n }).catch(onCheckpointError);\n }\n}\n\n// We create a basic promise so the caller can cancel the replication possibly\n// before we have actually started listening to changes etc\nclass Replication extends EE {\n constructor() {\n super();\n this.cancelled = false;\n this.state = 'pending';\n const promise = new Promise((fulfill, reject) => {\n this.once('complete', fulfill);\n this.once('error', reject);\n });\n this.then = function (resolve, reject) {\n return promise.then(resolve, reject);\n };\n this.catch = function (reject) {\n return promise.catch(reject);\n };\n // As we allow error handling via \"error\" event as well,\n // put a stub in here so that rejecting never throws UnhandledError.\n this.catch(function () {});\n }\n\n cancel() {\n this.cancelled = true;\n this.state = 'cancelled';\n this.emit('cancel');\n }\n\n ready(src, target) {\n if (this._readyCalled) {\n return;\n }\n this._readyCalled = true;\n\n const onDestroy = () => {\n this.cancel();\n };\n src.once('destroyed', onDestroy);\n target.once('destroyed', onDestroy);\n function cleanup() {\n src.removeListener('destroyed', onDestroy);\n target.removeListener('destroyed', onDestroy);\n }\n this.once('complete', cleanup);\n this.once('error', cleanup);\n }\n}\n\nfunction toPouch(db, opts) {\n var PouchConstructor = opts.PouchConstructor;\n if (typeof db === 'string') {\n return new PouchConstructor(db, opts);\n } else {\n return db;\n }\n}\n\nfunction replicateWrapper(src, target, opts, callback) {\n\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n if (typeof opts === 'undefined') {\n opts = {};\n }\n\n if (opts.doc_ids && !Array.isArray(opts.doc_ids)) {\n throw createError(BAD_REQUEST,\n \"`doc_ids` filter parameter is not a list.\");\n }\n\n opts.complete = callback;\n opts = clone(opts);\n opts.continuous = opts.continuous || opts.live;\n opts.retry = ('retry' in opts) ? opts.retry : false;\n opts.PouchConstructor = opts.PouchConstructor || this;\n var replicateRet = new Replication(opts);\n var srcPouch = toPouch(src, opts);\n var targetPouch = toPouch(target, opts);\n replicate(srcPouch, targetPouch, opts, replicateRet);\n return replicateRet;\n}\n\nfunction sync(src, target, opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n if (typeof opts === 'undefined') {\n opts = {};\n }\n opts = clone(opts);\n opts.PouchConstructor = opts.PouchConstructor || this;\n src = toPouch(src, opts);\n target = toPouch(target, opts);\n return new Sync(src, target, opts, callback);\n}\n\nclass Sync extends EE {\n constructor(src, target, opts, callback) {\n super();\n this.canceled = false;\n\n const optsPush = opts.push ? Object.assign({}, opts, opts.push) : opts;\n const optsPull = opts.pull ? Object.assign({}, opts, opts.pull) : opts;\n\n this.push = replicateWrapper(src, target, optsPush);\n this.pull = replicateWrapper(target, src, optsPull);\n\n this.pushPaused = true;\n this.pullPaused = true;\n\n const pullChange = (change) => {\n this.emit('change', {\n direction: 'pull',\n change\n });\n };\n const pushChange = (change) => {\n this.emit('change', {\n direction: 'push',\n change\n });\n };\n const pushDenied = (doc) => {\n this.emit('denied', {\n direction: 'push',\n doc\n });\n };\n const pullDenied = (doc) => {\n this.emit('denied', {\n direction: 'pull',\n doc\n });\n };\n const pushPaused = () => {\n this.pushPaused = true;\n /* istanbul ignore if */\n if (this.pullPaused) {\n this.emit('paused');\n }\n };\n const pullPaused = () => {\n this.pullPaused = true;\n /* istanbul ignore if */\n if (this.pushPaused) {\n this.emit('paused');\n }\n };\n const pushActive = () => {\n this.pushPaused = false;\n /* istanbul ignore if */\n if (this.pullPaused) {\n this.emit('active', {\n direction: 'push'\n });\n }\n };\n const pullActive = () => {\n this.pullPaused = false;\n /* istanbul ignore if */\n if (this.pushPaused) {\n this.emit('active', {\n direction: 'pull'\n });\n }\n };\n\n let removed = {};\n\n const removeAll = (type) => { // type is 'push' or 'pull'\n return (event, func) => {\n const isChange = event === 'change' &&\n (func === pullChange || func === pushChange);\n const isDenied = event === 'denied' &&\n (func === pullDenied || func === pushDenied);\n const isPaused = event === 'paused' &&\n (func === pullPaused || func === pushPaused);\n const isActive = event === 'active' &&\n (func === pullActive || func === pushActive);\n\n if (isChange || isDenied || isPaused || isActive) {\n if (!(event in removed)) {\n removed[event] = {};\n }\n removed[event][type] = true;\n if (Object.keys(removed[event]).length === 2) {\n // both push and pull have asked to be removed\n this.removeAllListeners(event);\n }\n }\n };\n };\n\n if (opts.live) {\n this.push.on('complete', this.pull.cancel.bind(this.pull));\n this.pull.on('complete', this.push.cancel.bind(this.push));\n }\n\n function addOneListener(ee, event, listener) {\n if (ee.listeners(event).indexOf(listener) == -1) {\n ee.on(event, listener);\n }\n }\n\n this.on('newListener', function (event) {\n if (event === 'change') {\n addOneListener(this.pull, 'change', pullChange);\n addOneListener(this.push, 'change', pushChange);\n } else if (event === 'denied') {\n addOneListener(this.pull, 'denied', pullDenied);\n addOneListener(this.push, 'denied', pushDenied);\n } else if (event === 'active') {\n addOneListener(this.pull, 'active', pullActive);\n addOneListener(this.push, 'active', pushActive);\n } else if (event === 'paused') {\n addOneListener(this.pull, 'paused', pullPaused);\n addOneListener(this.push, 'paused', pushPaused);\n }\n });\n\n this.on('removeListener', function (event) {\n if (event === 'change') {\n this.pull.removeListener('change', pullChange);\n this.push.removeListener('change', pushChange);\n } else if (event === 'denied') {\n this.pull.removeListener('denied', pullDenied);\n this.push.removeListener('denied', pushDenied);\n } else if (event === 'active') {\n this.pull.removeListener('active', pullActive);\n this.push.removeListener('active', pushActive);\n } else if (event === 'paused') {\n this.pull.removeListener('paused', pullPaused);\n this.push.removeListener('paused', pushPaused);\n }\n });\n\n this.pull.on('removeListener', removeAll('pull'));\n this.push.on('removeListener', removeAll('push'));\n\n const promise = Promise.all([\n this.push,\n this.pull\n ]).then((resp) => {\n const out = {\n push: resp[0],\n pull: resp[1]\n };\n this.emit('complete', out);\n if (callback) {\n callback(null, out);\n }\n this.removeAllListeners();\n return out;\n }, (err) => {\n this.cancel();\n if (callback) {\n // if there's a callback, then the callback can receive\n // the error event\n callback(err);\n } else {\n // if there's no callback, then we're safe to emit an error\n // event, which would otherwise throw an unhandled error\n // due to 'error' being a special event in EventEmitters\n this.emit('error', err);\n }\n this.removeAllListeners();\n if (callback) {\n // no sense throwing if we're already emitting an 'error' event\n throw err;\n }\n });\n\n this.then = function (success, err) {\n return promise.then(success, err);\n };\n\n this.catch = function (err) {\n return promise.catch(err);\n };\n }\n\n cancel() {\n if (!this.canceled) {\n this.canceled = true;\n this.push.cancel();\n this.pull.cancel();\n }\n }\n}\n\nfunction replication(PouchDB) {\n PouchDB.replicate = replicateWrapper;\n PouchDB.sync = sync;\n\n Object.defineProperty(PouchDB.prototype, 'replicate', {\n get: function () {\n var self = this;\n if (typeof this.replicateMethods === 'undefined') {\n this.replicateMethods = {\n from: function (other, opts, callback) {\n return self.constructor.replicate(other, self, opts, callback);\n },\n to: function (other, opts, callback) {\n return self.constructor.replicate(self, other, opts, callback);\n }\n };\n }\n return this.replicateMethods;\n }\n });\n\n PouchDB.prototype.sync = function (dbName, opts, callback) {\n return this.constructor.sync(this, dbName, opts, callback);\n };\n}\n\nPouchDB.plugin(IDBPouch)\n .plugin(HttpPouch$1)\n .plugin(mapreduce)\n .plugin(replication);\n\n// Pull from src because pouchdb-node/pouchdb-browser themselves\n\nexport default PouchDB;\n","class PouchError extends Error {\n constructor(status, error, reason) {\n super();\n this.status = status;\n this.name = error;\n this.message = reason;\n this.error = true;\n }\n\n toString() {\n return JSON.stringify({\n status: this.status,\n name: this.name,\n message: this.message,\n reason: this.reason\n });\n }\n}\n\nvar UNAUTHORIZED = new PouchError(401, 'unauthorized', \"Name or password is incorrect.\");\nvar MISSING_BULK_DOCS = new PouchError(400, 'bad_request', \"Missing JSON list of 'docs'\");\nvar MISSING_DOC = new PouchError(404, 'not_found', 'missing');\nvar REV_CONFLICT = new PouchError(409, 'conflict', 'Document update conflict');\nvar INVALID_ID = new PouchError(400, 'bad_request', '_id field must contain a string');\nvar MISSING_ID = new PouchError(412, 'missing_id', '_id is required for puts');\nvar RESERVED_ID = new PouchError(400, 'bad_request', 'Only reserved document ids may start with underscore.');\nvar NOT_OPEN = new PouchError(412, 'precondition_failed', 'Database not open');\nvar UNKNOWN_ERROR = new PouchError(500, 'unknown_error', 'Database encountered an unknown error');\nvar BAD_ARG = new PouchError(500, 'badarg', 'Some query argument is invalid');\nvar INVALID_REQUEST = new PouchError(400, 'invalid_request', 'Request was invalid');\nvar QUERY_PARSE_ERROR = new PouchError(400, 'query_parse_error', 'Some query parameter is invalid');\nvar DOC_VALIDATION = new PouchError(500, 'doc_validation', 'Bad special document member');\nvar BAD_REQUEST = new PouchError(400, 'bad_request', 'Something wrong with the request');\nvar NOT_AN_OBJECT = new PouchError(400, 'bad_request', 'Document must be a JSON object');\nvar DB_MISSING = new PouchError(404, 'not_found', 'Database not found');\nvar IDB_ERROR = new PouchError(500, 'indexed_db_went_bad', 'unknown');\nvar WSQ_ERROR = new PouchError(500, 'web_sql_went_bad', 'unknown');\nvar LDB_ERROR = new PouchError(500, 'levelDB_went_went_bad', 'unknown');\nvar FORBIDDEN = new PouchError(403, 'forbidden', 'Forbidden by design doc validate_doc_update function');\nvar INVALID_REV = new PouchError(400, 'bad_request', 'Invalid rev format');\nvar FILE_EXISTS = new PouchError(412, 'file_exists', 'The database could not be created, the file already exists.');\nvar MISSING_STUB = new PouchError(412, 'missing_stub', 'A pre-existing attachment stub wasn\\'t found');\nvar INVALID_URL = new PouchError(413, 'invalid_url', 'Provided URL is invalid');\n\nfunction createError(error, reason) {\n function CustomPouchError(reason) {\n // inherit error properties from our parent error manually\n // so as to allow proper JSON parsing.\n var names = Object.getOwnPropertyNames(error);\n for (var i = 0, len = names.length; i < len; i++) {\n if (typeof error[names[i]] !== 'function') {\n this[names[i]] = error[names[i]];\n }\n }\n\n if (this.stack === undefined) {\n this.stack = (new Error()).stack;\n }\n\n if (reason !== undefined) {\n this.reason = reason;\n }\n }\n CustomPouchError.prototype = PouchError.prototype;\n return new CustomPouchError(reason);\n}\n\nfunction generateErrorFromResponse(err) {\n\n if (typeof err !== 'object') {\n var data = err;\n err = UNKNOWN_ERROR;\n err.data = data;\n }\n\n if ('error' in err && err.error === 'conflict') {\n err.name = 'conflict';\n err.status = 409;\n }\n\n if (!('name' in err)) {\n err.name = err.error || 'unknown';\n }\n\n if (!('status' in err)) {\n err.status = 500;\n }\n\n if (!('message' in err)) {\n err.message = err.message || err.reason;\n }\n\n if (!('stack' in err)) {\n err.stack = (new Error()).stack;\n }\n\n return err;\n}\n\nexport { UNAUTHORIZED, MISSING_BULK_DOCS, MISSING_DOC, REV_CONFLICT, INVALID_ID, MISSING_ID, RESERVED_ID, NOT_OPEN, UNKNOWN_ERROR, BAD_ARG, INVALID_REQUEST, QUERY_PARSE_ERROR, DOC_VALIDATION, BAD_REQUEST, NOT_AN_OBJECT, DB_MISSING, WSQ_ERROR, LDB_ERROR, FORBIDDEN, INVALID_REV, FILE_EXISTS, MISSING_STUB, IDB_ERROR, INVALID_URL, createError, generateErrorFromResponse };\n","var f = fetch;\nvar h = Headers;\n\nexport { f as fetch, h as Headers };\n","var thisAtob = function (str) {\n return atob(str);\n};\n\nvar thisBtoa = function (str) {\n return btoa(str);\n};\n\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor (e.g.\n// old QtWebKit versions, Android < 4.4).\nfunction createBlob(parts, properties) {\n /* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */\n parts = parts || [];\n properties = properties || {};\n try {\n return new Blob(parts, properties);\n } catch (e) {\n if (e.name !== \"TypeError\") {\n throw e;\n }\n var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder :\n typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder :\n typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder :\n WebKitBlobBuilder;\n var builder = new Builder();\n for (var i = 0; i < parts.length; i += 1) {\n builder.append(parts[i]);\n }\n return builder.getBlob(properties.type);\n }\n}\n\n// From http://stackoverflow.com/questions/14967647/ (continues on next line)\n// encode-decode-image-with-base64-breaks-image (2013-04-21)\nfunction binaryStringToArrayBuffer(bin) {\n var length = bin.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n for (var i = 0; i < length; i++) {\n arr[i] = bin.charCodeAt(i);\n }\n return buf;\n}\n\nfunction binStringToBluffer(binString, type) {\n return createBlob([binaryStringToArrayBuffer(binString)], {type});\n}\n\nfunction b64ToBluffer(b64, type) {\n return binStringToBluffer(thisAtob(b64), type);\n}\n\n//Can't find original post, but this is close\n//http://stackoverflow.com/questions/6965107/ (continues on next line)\n//converting-between-strings-and-arraybuffers\nfunction arrayBufferToBinaryString(buffer) {\n var binary = '';\n var bytes = new Uint8Array(buffer);\n var length = bytes.byteLength;\n for (var i = 0; i < length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return binary;\n}\n\n// shim for browsers that don't support it\nfunction readAsBinaryString(blob, callback) {\n var reader = new FileReader();\n var hasBinaryString = typeof reader.readAsBinaryString === 'function';\n reader.onloadend = function (e) {\n var result = e.target.result || '';\n if (hasBinaryString) {\n return callback(result);\n }\n callback(arrayBufferToBinaryString(result));\n };\n if (hasBinaryString) {\n reader.readAsBinaryString(blob);\n } else {\n reader.readAsArrayBuffer(blob);\n }\n}\n\nfunction blobToBinaryString(blobOrBuffer, callback) {\n readAsBinaryString(blobOrBuffer, function (bin) {\n callback(bin);\n });\n}\n\nfunction blobToBase64(blobOrBuffer, callback) {\n blobToBinaryString(blobOrBuffer, function (base64) {\n callback(thisBtoa(base64));\n });\n}\n\n// simplified API. universal browser support is assumed\nfunction readAsArrayBuffer(blob, callback) {\n var reader = new FileReader();\n reader.onloadend = function (e) {\n var result = e.target.result || new ArrayBuffer(0);\n callback(result);\n };\n reader.readAsArrayBuffer(blob);\n}\n\n// this is not used in the browser\nfunction typedBuffer() {\n}\n\nexport { thisAtob as atob, thisBtoa as btoa, b64ToBluffer as base64StringToBlobOrBuffer, binaryStringToArrayBuffer, binStringToBluffer as binaryStringToBlobOrBuffer, createBlob as blob, blobToBase64 as blobOrBufferToBase64, blobToBinaryString as blobOrBufferToBinaryString, readAsArrayBuffer, readAsBinaryString, typedBuffer };\n","function pad(str, padWith, upToLength) {\n var padding = '';\n var targetLength = upToLength - str.length;\n /* istanbul ignore next */\n while (padding.length < targetLength) {\n padding += padWith;\n }\n return padding;\n}\n\nfunction padLeft(str, padWith, upToLength) {\n var padding = pad(str, padWith, upToLength);\n return padding + str;\n}\n\nvar MIN_MAGNITUDE = -324; // verified by -Number.MIN_VALUE\nvar MAGNITUDE_DIGITS = 3; // ditto\nvar SEP = ''; // set to '_' for easier debugging\n\nfunction collate(a, b) {\n\n if (a === b) {\n return 0;\n }\n\n a = normalizeKey(a);\n b = normalizeKey(b);\n\n var ai = collationIndex(a);\n var bi = collationIndex(b);\n if ((ai - bi) !== 0) {\n return ai - bi;\n }\n switch (typeof a) {\n case 'number':\n return a - b;\n case 'boolean':\n return a < b ? -1 : 1;\n case 'string':\n return stringCollate(a, b);\n }\n return Array.isArray(a) ? arrayCollate(a, b) : objectCollate(a, b);\n}\n\n// couch considers null/NaN/Infinity/-Infinity === undefined,\n// for the purposes of mapreduce indexes. also, dates get stringified.\nfunction normalizeKey(key) {\n switch (typeof key) {\n case 'undefined':\n return null;\n case 'number':\n if (key === Infinity || key === -Infinity || isNaN(key)) {\n return null;\n }\n return key;\n case 'object':\n var origKey = key;\n if (Array.isArray(key)) {\n var len = key.length;\n key = new Array(len);\n for (var i = 0; i < len; i++) {\n key[i] = normalizeKey(origKey[i]);\n }\n /* istanbul ignore next */\n } else if (key instanceof Date) {\n return key.toJSON();\n } else if (key !== null) { // generic object\n key = {};\n for (var k in origKey) {\n if (Object.prototype.hasOwnProperty.call(origKey, k)) {\n var val = origKey[k];\n if (typeof val !== 'undefined') {\n key[k] = normalizeKey(val);\n }\n }\n }\n }\n }\n return key;\n}\n\nfunction indexify(key) {\n if (key !== null) {\n switch (typeof key) {\n case 'boolean':\n return key ? 1 : 0;\n case 'number':\n return numToIndexableString(key);\n case 'string':\n // We've to be sure that key does not contain \\u0000\n // Do order-preserving replacements:\n // 0 -> 1, 1\n // 1 -> 1, 2\n // 2 -> 2, 2\n /* eslint-disable no-control-regex */\n return key\n .replace(/\\u0002/g, '\\u0002\\u0002')\n .replace(/\\u0001/g, '\\u0001\\u0002')\n .replace(/\\u0000/g, '\\u0001\\u0001');\n /* eslint-enable no-control-regex */\n case 'object':\n var isArray = Array.isArray(key);\n var arr = isArray ? key : Object.keys(key);\n var i = -1;\n var len = arr.length;\n var result = '';\n if (isArray) {\n while (++i < len) {\n result += toIndexableString(arr[i]);\n }\n } else {\n while (++i < len) {\n var objKey = arr[i];\n result += toIndexableString(objKey) +\n toIndexableString(key[objKey]);\n }\n }\n return result;\n }\n }\n return '';\n}\n\n// convert the given key to a string that would be appropriate\n// for lexical sorting, e.g. within a database, where the\n// sorting is the same given by the collate() function.\nfunction toIndexableString(key) {\n var zero = '\\u0000';\n key = normalizeKey(key);\n return collationIndex(key) + SEP + indexify(key) + zero;\n}\n\nfunction parseNumber(str, i) {\n var originalIdx = i;\n var num;\n var zero = str[i] === '1';\n if (zero) {\n num = 0;\n i++;\n } else {\n var neg = str[i] === '0';\n i++;\n var numAsString = '';\n var magAsString = str.substring(i, i + MAGNITUDE_DIGITS);\n var magnitude = parseInt(magAsString, 10) + MIN_MAGNITUDE;\n /* istanbul ignore next */\n if (neg) {\n magnitude = -magnitude;\n }\n i += MAGNITUDE_DIGITS;\n while (true) {\n var ch = str[i];\n if (ch === '\\u0000') {\n break;\n } else {\n numAsString += ch;\n }\n i++;\n }\n numAsString = numAsString.split('.');\n if (numAsString.length === 1) {\n num = parseInt(numAsString, 10);\n } else {\n /* istanbul ignore next */\n num = parseFloat(numAsString[0] + '.' + numAsString[1]);\n }\n /* istanbul ignore next */\n if (neg) {\n num = num - 10;\n }\n /* istanbul ignore next */\n if (magnitude !== 0) {\n // parseFloat is more reliable than pow due to rounding errors\n // e.g. Number.MAX_VALUE would return Infinity if we did\n // num * Math.pow(10, magnitude);\n num = parseFloat(num + 'e' + magnitude);\n }\n }\n return {num, length : i - originalIdx};\n}\n\n// move up the stack while parsing\n// this function moved outside of parseIndexableString for performance\nfunction pop(stack, metaStack) {\n var obj = stack.pop();\n\n if (metaStack.length) {\n var lastMetaElement = metaStack[metaStack.length - 1];\n if (obj === lastMetaElement.element) {\n // popping a meta-element, e.g. an object whose value is another object\n metaStack.pop();\n lastMetaElement = metaStack[metaStack.length - 1];\n }\n var element = lastMetaElement.element;\n var lastElementIndex = lastMetaElement.index;\n if (Array.isArray(element)) {\n element.push(obj);\n } else if (lastElementIndex === stack.length - 2) { // obj with key+value\n var key = stack.pop();\n element[key] = obj;\n } else {\n stack.push(obj); // obj with key only\n }\n }\n}\n\nfunction parseIndexableString(str) {\n var stack = [];\n var metaStack = []; // stack for arrays and objects\n var i = 0;\n\n /*eslint no-constant-condition: [\"error\", { \"checkLoops\": false }]*/\n while (true) {\n var collationIndex = str[i++];\n if (collationIndex === '\\u0000') {\n if (stack.length === 1) {\n return stack.pop();\n } else {\n pop(stack, metaStack);\n continue;\n }\n }\n switch (collationIndex) {\n case '1':\n stack.push(null);\n break;\n case '2':\n stack.push(str[i] === '1');\n i++;\n break;\n case '3':\n var parsedNum = parseNumber(str, i);\n stack.push(parsedNum.num);\n i += parsedNum.length;\n break;\n case '4':\n var parsedStr = '';\n /*eslint no-constant-condition: [\"error\", { \"checkLoops\": false }]*/\n while (true) {\n var ch = str[i];\n if (ch === '\\u0000') {\n break;\n }\n parsedStr += ch;\n i++;\n }\n // perform the reverse of the order-preserving replacement\n // algorithm (see above)\n /* eslint-disable no-control-regex */\n parsedStr = parsedStr.replace(/\\u0001\\u0001/g, '\\u0000')\n .replace(/\\u0001\\u0002/g, '\\u0001')\n .replace(/\\u0002\\u0002/g, '\\u0002');\n /* eslint-enable no-control-regex */\n stack.push(parsedStr);\n break;\n case '5':\n var arrayElement = { element: [], index: stack.length };\n stack.push(arrayElement.element);\n metaStack.push(arrayElement);\n break;\n case '6':\n var objElement = { element: {}, index: stack.length };\n stack.push(objElement.element);\n metaStack.push(objElement);\n break;\n /* istanbul ignore next */\n default:\n throw new Error(\n 'bad collationIndex or unexpectedly reached end of input: ' +\n collationIndex);\n }\n }\n}\n\nfunction arrayCollate(a, b) {\n var len = Math.min(a.length, b.length);\n for (var i = 0; i < len; i++) {\n var sort = collate(a[i], b[i]);\n if (sort !== 0) {\n return sort;\n }\n }\n return (a.length === b.length) ? 0 :\n (a.length > b.length) ? 1 : -1;\n}\nfunction stringCollate(a, b) {\n // See: https://github.com/daleharvey/pouchdb/issues/40\n // This is incompatible with the CouchDB implementation, but its the\n // best we can do for now\n return (a === b) ? 0 : ((a > b) ? 1 : -1);\n}\nfunction objectCollate(a, b) {\n var ak = Object.keys(a), bk = Object.keys(b);\n var len = Math.min(ak.length, bk.length);\n for (var i = 0; i < len; i++) {\n // First sort the keys\n var sort = collate(ak[i], bk[i]);\n if (sort !== 0) {\n return sort;\n }\n // if the keys are equal sort the values\n sort = collate(a[ak[i]], b[bk[i]]);\n if (sort !== 0) {\n return sort;\n }\n\n }\n return (ak.length === bk.length) ? 0 :\n (ak.length > bk.length) ? 1 : -1;\n}\n// The collation is defined by erlangs ordered terms\n// the atoms null, true, false come first, then numbers, strings,\n// arrays, then objects\n// null/undefined/NaN/Infinity/-Infinity are all considered null\nfunction collationIndex(x) {\n var id = ['boolean', 'number', 'string', 'object'];\n var idx = id.indexOf(typeof x);\n //false if -1 otherwise true, but fast!!!!1\n if (~idx) {\n if (x === null) {\n return 1;\n }\n if (Array.isArray(x)) {\n return 5;\n }\n return idx < 3 ? (idx + 2) : (idx + 3);\n }\n /* istanbul ignore next */\n if (Array.isArray(x)) {\n return 5;\n }\n}\n\n// conversion:\n// x yyy zz...zz\n// x = 0 for negative, 1 for 0, 2 for positive\n// y = exponent (for negative numbers negated) moved so that it's >= 0\n// z = mantisse\nfunction numToIndexableString(num) {\n\n if (num === 0) {\n return '1';\n }\n\n // convert number to exponential format for easier and\n // more succinct string sorting\n var expFormat = num.toExponential().split(/e\\+?/);\n var magnitude = parseInt(expFormat[1], 10);\n\n var neg = num < 0;\n\n var result = neg ? '0' : '2';\n\n // first sort by magnitude\n // it's easier if all magnitudes are positive\n var magForComparison = ((neg ? -magnitude : magnitude) - MIN_MAGNITUDE);\n var magString = padLeft((magForComparison).toString(), '0', MAGNITUDE_DIGITS);\n\n result += SEP + magString;\n\n // then sort by the factor\n var factor = Math.abs(parseFloat(expFormat[0])); // [1..10)\n /* istanbul ignore next */\n if (neg) { // for negative reverse ordering\n factor = 10 - factor;\n }\n\n var factorStr = factor.toFixed(20);\n\n // strip zeros from the end\n factorStr = factorStr.replace(/\\.?0+$/, '');\n\n result += SEP + factorStr;\n\n return result;\n}\n\nexport { collate, normalizeKey, toIndexableString, parseIndexableString };\n","import { btoa, readAsArrayBuffer } from 'pouchdb-binary-utils';\nimport Md5 from 'spark-md5';\n\nvar setImmediateShim = self.setImmediate || self.setTimeout;\nvar MD5_CHUNK_SIZE = 32768;\n\nfunction rawToBase64(raw) {\n return btoa(raw);\n}\n\nfunction appendBlob(buffer, blob, start, end, callback) {\n if (start > 0 || end < blob.size) {\n // only slice blob if we really need to\n blob = blob.slice(start, end);\n }\n readAsArrayBuffer(blob, function (arrayBuffer) {\n buffer.append(arrayBuffer);\n callback();\n });\n}\n\nfunction appendString(buffer, string, start, end, callback) {\n if (start > 0 || end < string.length) {\n // only create a substring if we really need to\n string = string.substring(start, end);\n }\n buffer.appendBinary(string);\n callback();\n}\n\nfunction binaryMd5(data, callback) {\n var inputIsString = typeof data === 'string';\n var len = inputIsString ? data.length : data.size;\n var chunkSize = Math.min(MD5_CHUNK_SIZE, len);\n var chunks = Math.ceil(len / chunkSize);\n var currentChunk = 0;\n var buffer = inputIsString ? new Md5() : new Md5.ArrayBuffer();\n\n var append = inputIsString ? appendString : appendBlob;\n\n function next() {\n setImmediateShim(loadNextChunk);\n }\n\n function done() {\n var raw = buffer.end(true);\n var base64 = rawToBase64(raw);\n callback(base64);\n buffer.destroy();\n }\n\n function loadNextChunk() {\n var start = currentChunk * chunkSize;\n var end = start + chunkSize;\n currentChunk++;\n if (currentChunk < chunks) {\n append(buffer, data, start, end, next);\n } else {\n append(buffer, data, start, end, done);\n }\n }\n loadNextChunk();\n}\n\nfunction stringMd5(string) {\n return Md5.hash(string);\n}\n\nexport { binaryMd5, stringMd5 };\n","import { createError, BAD_REQUEST, INVALID_ID, MISSING_ID, RESERVED_ID } from 'pouchdb-errors';\nimport EventEmitter from 'events';\nimport { v4 } from 'uuid';\nimport { stringMd5 } from 'pouchdb-md5';\n\nfunction isBinaryObject(object) {\n return (typeof ArrayBuffer !== 'undefined' && object instanceof ArrayBuffer) ||\n (typeof Blob !== 'undefined' && object instanceof Blob);\n}\n\n/**\n * @template {ArrayBuffer | Blob} T\n * @param {T} object\n * @returns {T}\n */\nfunction cloneBinaryObject(object) {\n return object instanceof ArrayBuffer\n ? object.slice(0)\n : object.slice(0, object.size, object.type);\n}\n\n// most of this is borrowed from lodash.isPlainObject:\n// https://github.com/fis-components/lodash.isplainobject/\n// blob/29c358140a74f252aeb08c9eb28bef86f2217d4a/index.js\n\nvar funcToString = Function.prototype.toString;\nvar objectCtorString = funcToString.call(Object);\n\nfunction isPlainObject(value) {\n var proto = Object.getPrototypeOf(value);\n /* istanbul ignore if */\n if (proto === null) { // not sure when this happens, but I guess it can\n return true;\n }\n var Ctor = proto.constructor;\n return (typeof Ctor == 'function' &&\n Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString);\n}\n\nfunction clone(object) {\n var newObject;\n var i;\n var len;\n\n if (!object || typeof object !== 'object') {\n return object;\n }\n\n if (Array.isArray(object)) {\n newObject = [];\n for (i = 0, len = object.length; i < len; i++) {\n newObject[i] = clone(object[i]);\n }\n return newObject;\n }\n\n // special case: to avoid inconsistencies between IndexedDB\n // and other backends, we automatically stringify Dates\n if (object instanceof Date && isFinite(object)) {\n return object.toISOString();\n }\n\n if (isBinaryObject(object)) {\n return cloneBinaryObject(object);\n }\n\n if (!isPlainObject(object)) {\n return object; // don't clone objects like Workers\n }\n\n newObject = {};\n for (i in object) {\n /* istanbul ignore else */\n if (Object.prototype.hasOwnProperty.call(object, i)) {\n var value = clone(object[i]);\n if (typeof value !== 'undefined') {\n newObject[i] = value;\n }\n }\n }\n return newObject;\n}\n\nfunction once(fun) {\n var called = false;\n return function (...args) {\n /* istanbul ignore if */\n if (called) {\n // this is a smoke test and should never actually happen\n throw new Error('once called more than once');\n } else {\n called = true;\n fun.apply(this, args);\n }\n };\n}\n\nfunction toPromise(func) {\n //create the function we will be returning\n return function (...args) {\n // Clone arguments\n args = clone(args);\n var self = this;\n // if the last argument is a function, assume its a callback\n var usedCB = (typeof args[args.length - 1] === 'function') ? args.pop() : false;\n var promise = new Promise(function (fulfill, reject) {\n var resp;\n try {\n var callback = once(function (err, mesg) {\n if (err) {\n reject(err);\n } else {\n fulfill(mesg);\n }\n });\n // create a callback for this invocation\n // apply the function in the orig context\n args.push(callback);\n resp = func.apply(self, args);\n if (resp && typeof resp.then === 'function') {\n fulfill(resp);\n }\n } catch (e) {\n reject(e);\n }\n });\n // if there is a callback, call it back\n if (usedCB) {\n promise.then(function (result) {\n usedCB(null, result);\n }, usedCB);\n }\n return promise;\n };\n}\n\nfunction logApiCall(self, name, args) {\n /* istanbul ignore if */\n if (self.constructor.listeners('debug').length) {\n var logArgs = ['api', self.name, name];\n for (var i = 0; i < args.length - 1; i++) {\n logArgs.push(args[i]);\n }\n self.constructor.emit('debug', logArgs);\n\n // override the callback itself to log the response\n var origCallback = args[args.length - 1];\n args[args.length - 1] = function (err, res) {\n var responseArgs = ['api', self.name, name];\n responseArgs = responseArgs.concat(\n err ? ['error', err] : ['success', res]\n );\n self.constructor.emit('debug', responseArgs);\n origCallback(err, res);\n };\n }\n}\n\nfunction adapterFun(name, callback) {\n return toPromise(function (...args) {\n if (this._closed) {\n return Promise.reject(new Error('database is closed'));\n }\n if (this._destroyed) {\n return Promise.reject(new Error('database is destroyed'));\n }\n var self = this;\n logApiCall(self, name, args);\n if (!this.taskqueue.isReady) {\n return new Promise(function (fulfill, reject) {\n self.taskqueue.addTask(function (failed) {\n if (failed) {\n reject(failed);\n } else {\n fulfill(self[name].apply(self, args));\n }\n });\n });\n }\n return callback.apply(this, args);\n });\n}\n\n// like underscore/lodash _.pick()\nfunction pick(obj, arr) {\n var res = {};\n for (var i = 0, len = arr.length; i < len; i++) {\n var prop = arr[i];\n if (prop in obj) {\n res[prop] = obj[prop];\n }\n }\n return res;\n}\n\n// Most browsers throttle concurrent requests at 6, so it's silly\n// to shim _bulk_get by trying to launch potentially hundreds of requests\n// and then letting the majority time out. We can handle this ourselves.\nvar MAX_NUM_CONCURRENT_REQUESTS = 6;\n\nfunction identityFunction(x) {\n return x;\n}\n\nfunction formatResultForOpenRevsGet(result) {\n return [{\n ok: result\n }];\n}\n\n// shim for P/CouchDB adapters that don't directly implement _bulk_get\nfunction bulkGet(db, opts, callback) {\n var requests = opts.docs;\n\n // consolidate into one request per doc if possible\n var requestsById = new Map();\n requests.forEach(function (request) {\n if (requestsById.has(request.id)) {\n requestsById.get(request.id).push(request);\n } else {\n requestsById.set(request.id, [request]);\n }\n });\n\n var numDocs = requestsById.size;\n var numDone = 0;\n var perDocResults = new Array(numDocs);\n\n function collapseResultsAndFinish() {\n var results = [];\n perDocResults.forEach(function (res) {\n res.docs.forEach(function (info) {\n results.push({\n id: res.id,\n docs: [info]\n });\n });\n });\n callback(null, {results});\n }\n\n function checkDone() {\n if (++numDone === numDocs) {\n collapseResultsAndFinish();\n }\n }\n\n function gotResult(docIndex, id, docs) {\n perDocResults[docIndex] = {id, docs};\n checkDone();\n }\n\n var allRequests = [];\n requestsById.forEach(function (value, key) {\n allRequests.push(key);\n });\n\n var i = 0;\n\n function nextBatch() {\n\n if (i >= allRequests.length) {\n return;\n }\n\n var upTo = Math.min(i + MAX_NUM_CONCURRENT_REQUESTS, allRequests.length);\n var batch = allRequests.slice(i, upTo);\n processBatch(batch, i);\n i += batch.length;\n }\n\n function processBatch(batch, offset) {\n batch.forEach(function (docId, j) {\n var docIdx = offset + j;\n var docRequests = requestsById.get(docId);\n\n // just use the first request as the \"template\"\n // TODO: The _bulk_get API allows for more subtle use cases than this,\n // but for now it is unlikely that there will be a mix of different\n // \"atts_since\" or \"attachments\" in the same request, since it's just\n // replicate.js that is using this for the moment.\n // Also, atts_since is aspirational, since we don't support it yet.\n var docOpts = pick(docRequests[0], ['atts_since', 'attachments']);\n docOpts.open_revs = docRequests.map(function (request) {\n // rev is optional, open_revs disallowed\n return request.rev;\n });\n\n // remove falsey / undefined revisions\n docOpts.open_revs = docOpts.open_revs.filter(identityFunction);\n\n var formatResult = identityFunction;\n\n if (docOpts.open_revs.length === 0) {\n delete docOpts.open_revs;\n\n // when fetching only the \"winning\" leaf,\n // transform the result so it looks like an open_revs\n // request\n formatResult = formatResultForOpenRevsGet;\n }\n\n // globally-supplied options\n ['revs', 'attachments', 'binary', 'ajax', 'latest'].forEach(function (param) {\n if (param in opts) {\n docOpts[param] = opts[param];\n }\n });\n db.get(docId, docOpts, function (err, res) {\n var result;\n /* istanbul ignore if */\n if (err) {\n result = [{error: err}];\n } else {\n result = formatResult(res);\n }\n gotResult(docIdx, docId, result);\n nextBatch();\n });\n });\n }\n\n nextBatch();\n\n}\n\nvar hasLocal;\n\ntry {\n localStorage.setItem('_pouch_check_localstorage', 1);\n hasLocal = !!localStorage.getItem('_pouch_check_localstorage');\n} catch (e) {\n hasLocal = false;\n}\n\nfunction hasLocalStorage() {\n return hasLocal;\n}\n\nconst nextTick = typeof queueMicrotask === \"function\"\n ? queueMicrotask\n : function nextTick(fn) {\n Promise.resolve().then(fn);\n };\n\nclass Changes extends EventEmitter {\n constructor() {\n super();\n\n this._listeners = {};\n\n if (hasLocalStorage()) {\n addEventListener(\"storage\", (e) => {\n this.emit(e.key);\n });\n }\n }\n\n addListener(dbName, id, db, opts) {\n if (this._listeners[id]) {\n return;\n }\n var inprogress = false;\n var self = this;\n function eventFunction() {\n if (!self._listeners[id]) {\n return;\n }\n if (inprogress) {\n inprogress = 'waiting';\n return;\n }\n inprogress = true;\n var changesOpts = pick(opts, [\n 'style', 'include_docs', 'attachments', 'conflicts', 'filter',\n 'doc_ids', 'view', 'since', 'query_params', 'binary', 'return_docs'\n ]);\n\n function onError() {\n inprogress = false;\n }\n\n db.changes(changesOpts).on('change', function (c) {\n if (c.seq > opts.since && !opts.cancelled) {\n opts.since = c.seq;\n opts.onChange(c);\n }\n }).on('complete', function () {\n if (inprogress === 'waiting') {\n nextTick(eventFunction);\n }\n inprogress = false;\n }).on('error', onError);\n }\n this._listeners[id] = eventFunction;\n this.on(dbName, eventFunction);\n }\n\n removeListener(dbName, id) {\n if (!(id in this._listeners)) {\n return;\n }\n super.removeListener(dbName, this._listeners[id]);\n delete this._listeners[id];\n }\n\n notifyLocalWindows(dbName) {\n //do a useless change on a storage thing\n //in order to get other windows's listeners to activate\n if (hasLocalStorage()) {\n localStorage[dbName] = (localStorage[dbName] === \"a\") ? \"b\" : \"a\";\n }\n }\n\n notify(dbName) {\n this.emit(dbName);\n this.notifyLocalWindows(dbName);\n }\n}\n\nfunction guardedConsole(method) {\n /* istanbul ignore else */\n if (typeof console !== 'undefined' && typeof console[method] === 'function') {\n var args = Array.prototype.slice.call(arguments, 1);\n console[method].apply(console, args);\n }\n}\n\nfunction randomNumber(min, max) {\n var maxTimeout = 600000; // Hard-coded default of 10 minutes\n min = parseInt(min, 10) || 0;\n max = parseInt(max, 10);\n if (max !== max || max <= min) {\n max = (min || 1) << 1; //doubling\n } else {\n max = max + 1;\n }\n // In order to not exceed maxTimeout, pick a random value between half of maxTimeout and maxTimeout\n if (max > maxTimeout) {\n min = maxTimeout >> 1; // divide by two\n max = maxTimeout;\n }\n var ratio = Math.random();\n var range = max - min;\n\n return ~~(range * ratio + min); // ~~ coerces to an int, but fast.\n}\n\nfunction defaultBackOff(min) {\n var max = 0;\n if (!min) {\n max = 2000;\n }\n return randomNumber(min, max);\n}\n\n// designed to give info to browser users, who are disturbed\n// when they see http errors in the console\nfunction explainError(status, str) {\n guardedConsole('info', 'The above ' + status + ' is totally normal. ' + str);\n}\n\nfunction tryFilter(filter, doc, req) {\n try {\n return !filter(doc, req);\n } catch (err) {\n var msg = 'Filter function threw: ' + err.toString();\n return createError(BAD_REQUEST, msg);\n }\n}\n\nfunction filterChange(opts) {\n var req = {};\n var hasFilter = opts.filter && typeof opts.filter === 'function';\n req.query = opts.query_params;\n\n return function filter(change) {\n if (!change.doc) {\n // CSG sends events on the changes feed that don't have documents,\n // this hack makes a whole lot of existing code robust.\n change.doc = {};\n }\n\n var filterReturn = hasFilter && tryFilter(opts.filter, change.doc, req);\n\n if (typeof filterReturn === 'object') {\n return filterReturn;\n }\n\n if (filterReturn) {\n return false;\n }\n\n if (!opts.include_docs) {\n delete change.doc;\n } else if (!opts.attachments) {\n for (var att in change.doc._attachments) {\n /* istanbul ignore else */\n if (Object.prototype.hasOwnProperty.call(change.doc._attachments, att)) {\n change.doc._attachments[att].stub = true;\n }\n }\n }\n return true;\n };\n}\n\n// shim for Function.prototype.name,\n// for browsers that don't support it like IE\n\n/* istanbul ignore next */\nfunction f() {}\n\nvar hasName = f.name;\nvar res;\n\n// We don't run coverage in IE\n/* istanbul ignore else */\nif (hasName) {\n res = function (fun) {\n return fun.name;\n };\n} else {\n res = function (fun) {\n var match = fun.toString().match(/^\\s*function\\s*(?:(\\S+)\\s*)?\\(/);\n if (match && match[1]) {\n return match[1];\n }\n else {\n return '';\n }\n };\n}\n\nvar res$1 = res;\n\n// Determine id an ID is valid\n// - invalid IDs begin with an underescore that does not begin '_design' or\n// '_local'\n// - any other string value is a valid id\n// Returns the specific error object for each case\nfunction invalidIdError(id) {\n var err;\n if (!id) {\n err = createError(MISSING_ID);\n } else if (typeof id !== 'string') {\n err = createError(INVALID_ID);\n } else if (/^_/.test(id) && !(/^_(design|local)/).test(id)) {\n err = createError(RESERVED_ID);\n }\n if (err) {\n throw err;\n }\n}\n\n// Checks if a PouchDB object is \"remote\" or not. This is\n\nfunction isRemote(db) {\n if (typeof db._remote === 'boolean') {\n return db._remote;\n }\n /* istanbul ignore next */\n if (typeof db.type === 'function') {\n guardedConsole('warn',\n 'db.type() is deprecated and will be removed in ' +\n 'a future version of PouchDB');\n return db.type() === 'http';\n }\n /* istanbul ignore next */\n return false;\n}\n\nfunction listenerCount(ee, type) {\n return 'listenerCount' in ee ? ee.listenerCount(type) :\n EventEmitter.listenerCount(ee, type);\n}\n\nfunction parseDesignDocFunctionName(s) {\n if (!s) {\n return null;\n }\n var parts = s.split('/');\n if (parts.length === 2) {\n return parts;\n }\n if (parts.length === 1) {\n return [s, s];\n }\n return null;\n}\n\nfunction normalizeDesignDocFunctionName(s) {\n var normalized = parseDesignDocFunctionName(s);\n return normalized ? normalized.join('/') : null;\n}\n\n// originally parseUri 1.2.2, now patched by us\n// (c) Steven Levithan <stevenlevithan.com>\n// MIT License\nvar keys = [\"source\", \"protocol\", \"authority\", \"userInfo\", \"user\", \"password\",\n \"host\", \"port\", \"relative\", \"path\", \"directory\", \"file\", \"query\", \"anchor\"];\nvar qName =\"queryKey\";\nvar qParser = /(?:^|&)([^&=]*)=?([^&]*)/g;\n\n// use the \"loose\" parser\n/* eslint no-useless-escape: 0 */\nvar parser = /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\n\nfunction parseUri(str) {\n var m = parser.exec(str);\n var uri = {};\n var i = 14;\n\n while (i--) {\n var key = keys[i];\n var value = m[i] || \"\";\n var encoded = ['user', 'password'].indexOf(key) !== -1;\n uri[key] = encoded ? decodeURIComponent(value) : value;\n }\n\n uri[qName] = {};\n uri[keys[12]].replace(qParser, function ($0, $1, $2) {\n if ($1) {\n uri[qName][$1] = $2;\n }\n });\n\n return uri;\n}\n\n// Based on https://github.com/alexdavid/scope-eval v0.0.3\n// (source: https://unpkg.com/scope-eval@0.0.3/scope_eval.js)\n// This is basically just a wrapper around new Function()\n\nfunction scopeEval(source, scope) {\n var keys = [];\n var values = [];\n for (var key in scope) {\n if (Object.prototype.hasOwnProperty.call(scope, key)) {\n keys.push(key);\n values.push(scope[key]);\n }\n }\n keys.push(source);\n return Function.apply(null, keys).apply(null, values);\n}\n\n// this is essentially the \"update sugar\" function from daleharvey/pouchdb#1388\n// the diffFun tells us what delta to apply to the doc. it either returns\n// the doc, or false if it doesn't need to do an update after all\nfunction upsert(db, docId, diffFun) {\n return db.get(docId)\n .catch(function (err) {\n /* istanbul ignore next */\n if (err.status !== 404) {\n throw err;\n }\n return {};\n })\n .then(function (doc) {\n // the user might change the _rev, so save it for posterity\n var docRev = doc._rev;\n var newDoc = diffFun(doc);\n\n if (!newDoc) {\n // if the diffFun returns falsy, we short-circuit as\n // an optimization\n return {updated: false, rev: docRev};\n }\n\n // users aren't allowed to modify these values,\n // so reset them here\n newDoc._id = docId;\n newDoc._rev = docRev;\n return tryAndPut(db, newDoc, diffFun);\n });\n}\n\nfunction tryAndPut(db, doc, diffFun) {\n return db.put(doc).then(function (res) {\n return {\n updated: true,\n rev: res.rev\n };\n }, function (err) {\n /* istanbul ignore next */\n if (err.status !== 409) {\n throw err;\n }\n return upsert(db, doc._id, diffFun);\n });\n}\n\n/**\n * Creates a new revision string that does NOT include the revision height\n * For example '56649f1b0506c6ca9fda0746eb0cacdf'\n */\nfunction rev(doc, deterministic_revs) {\n if (!deterministic_revs) {\n return v4().replace(/-/g, '').toLowerCase();\n }\n\n var mutateableDoc = Object.assign({}, doc);\n delete mutateableDoc._rev_tree;\n return stringMd5(JSON.stringify(mutateableDoc));\n}\n\nvar uuid = v4; // mimic old import, only v4 is ever used elsewhere\n\nexport { adapterFun, bulkGet as bulkGetShim, Changes as changesHandler, clone, defaultBackOff, explainError, filterChange, res$1 as functionName, guardedConsole, hasLocalStorage, invalidIdError, isRemote, listenerCount, nextTick, normalizeDesignDocFunctionName as normalizeDdocFunctionName, once, parseDesignDocFunctionName as parseDdocFunctionName, parseUri, pick, rev, scopeEval, toPromise, upsert, uuid };\n","import { nextTick } from 'pouchdb-utils';\n\nclass QueryParseError extends Error {\n constructor(message) {\n super();\n this.status = 400;\n this.name = 'query_parse_error';\n this.message = message;\n this.error = true;\n try {\n Error.captureStackTrace(this, QueryParseError);\n } catch (e) {}\n }\n}\n\nclass NotFoundError extends Error {\n constructor(message) {\n super();\n this.status = 404;\n this.name = 'not_found';\n this.message = message;\n this.error = true;\n try {\n Error.captureStackTrace(this, NotFoundError);\n } catch (e) {}\n }\n}\n\nclass BuiltInError extends Error {\n constructor(message) {\n super();\n this.status = 500;\n this.name = 'invalid_value';\n this.message = message;\n this.error = true;\n try {\n Error.captureStackTrace(this, BuiltInError);\n } catch (e) {}\n }\n}\n\nfunction promisedCallback(promise, callback) {\n if (callback) {\n promise.then(function (res) {\n nextTick(function () {\n callback(null, res);\n });\n }, function (reason) {\n nextTick(function () {\n callback(reason);\n });\n });\n }\n return promise;\n}\n\nfunction callbackify(fun) {\n return function (...args) {\n var cb = args.pop();\n var promise = fun.apply(this, args);\n if (typeof cb === 'function') {\n promisedCallback(promise, cb);\n }\n return promise;\n };\n}\n\n// Promise finally util similar to Q.finally\nfunction fin(promise, finalPromiseFactory) {\n return promise.then(function (res) {\n return finalPromiseFactory().then(function () {\n return res;\n });\n }, function (reason) {\n return finalPromiseFactory().then(function () {\n throw reason;\n });\n });\n}\n\nfunction sequentialize(queue, promiseFactory) {\n return function () {\n var args = arguments;\n var that = this;\n return queue.add(function () {\n return promiseFactory.apply(that, args);\n });\n };\n}\n\n// uniq an array of strings, order not guaranteed\n// similar to underscore/lodash _.uniq\nfunction uniq(arr) {\n var theSet = new Set(arr);\n var result = new Array(theSet.size);\n var index = -1;\n theSet.forEach(function (value) {\n result[++index] = value;\n });\n return result;\n}\n\nfunction mapToKeysArray(map) {\n var result = new Array(map.size);\n var index = -1;\n map.forEach(function (value, key) {\n result[++index] = key;\n });\n return result;\n}\n\nexport { uniq, sequentialize, fin, callbackify, promisedCallback, mapToKeysArray, QueryParseError, NotFoundError, BuiltInError };\n","import { base64StringToBlobOrBuffer } from 'pouchdb-binary-utils';\nimport { collate, toIndexableString, normalizeKey, parseIndexableString } from 'pouchdb-collate';\nimport { generateErrorFromResponse } from 'pouchdb-errors';\nimport { Headers } from 'pouchdb-fetch';\nimport { upsert, guardedConsole, nextTick, isRemote } from 'pouchdb-utils';\nimport { stringMd5 } from 'pouchdb-md5';\nimport { callbackify, sequentialize, uniq, fin, promisedCallback, mapToKeysArray, QueryParseError, NotFoundError, BuiltInError } from 'pouchdb-mapreduce-utils';\n\n/*\n * Simple task queue to sequentialize actions. Assumes\n * callbacks will eventually fire (once).\n */\n\nclass TaskQueue {\n constructor() {\n this.promise = Promise.resolve();\n }\n\n add(promiseFactory) {\n this.promise = this.promise\n // just recover\n .catch(() => { })\n .then(() => promiseFactory());\n return this.promise;\n }\n\n finish() {\n return this.promise;\n }\n}\n\nfunction stringify(input) {\n if (!input) {\n return 'undefined'; // backwards compat for empty reduce\n }\n // for backwards compat with mapreduce, functions/strings are stringified\n // as-is. everything else is JSON-stringified.\n switch (typeof input) {\n case 'function':\n // e.g. a mapreduce map\n return input.toString();\n case 'string':\n // e.g. a mapreduce built-in _reduce function\n return input.toString();\n default:\n // e.g. a JSON object in the case of mango queries\n return JSON.stringify(input);\n }\n}\n\n/* create a string signature for a view so we can cache it and uniq it */\nfunction createViewSignature(mapFun, reduceFun) {\n // the \"undefined\" part is for backwards compatibility\n return stringify(mapFun) + stringify(reduceFun) + 'undefined';\n}\n\nasync function createView(sourceDB, viewName, mapFun, reduceFun, temporary, localDocName) {\n const viewSignature = createViewSignature(mapFun, reduceFun);\n\n let cachedViews;\n if (!temporary) {\n // cache this to ensure we don't try to update the same view twice\n cachedViews = sourceDB._cachedViews = sourceDB._cachedViews || {};\n if (cachedViews[viewSignature]) {\n return cachedViews[viewSignature];\n }\n }\n\n const promiseForView = sourceDB.info().then(async function (info) {\n const depDbName = info.db_name + '-mrview-' +\n (temporary ? 'temp' : stringMd5(viewSignature));\n\n // save the view name in the source db so it can be cleaned up if necessary\n // (e.g. when the _design doc is deleted, remove all associated view data)\n function diffFunction(doc) {\n doc.views = doc.views || {};\n let fullViewName = viewName;\n if (fullViewName.indexOf('/') === -1) {\n fullViewName = viewName + '/' + viewName;\n }\n const depDbs = doc.views[fullViewName] = doc.views[fullViewName] || {};\n /* istanbul ignore if */\n if (depDbs[depDbName]) {\n return; // no update necessary\n }\n depDbs[depDbName] = true;\n return doc;\n }\n await upsert(sourceDB, '_local/' + localDocName, diffFunction);\n const res = await sourceDB.registerDependentDatabase(depDbName);\n const db = res.db;\n db.auto_compaction = true;\n const view = {\n name: depDbName,\n db,\n sourceDB,\n adapter: sourceDB.adapter,\n mapFun,\n reduceFun\n };\n\n let lastSeqDoc;\n try {\n lastSeqDoc = await view.db.get('_local/lastSeq');\n } catch (err) {\n /* istanbul ignore if */\n if (err.status !== 404) {\n throw err;\n }\n }\n\n view.seq = lastSeqDoc ? lastSeqDoc.seq : 0;\n if (cachedViews) {\n view.db.once('destroyed', function () {\n delete cachedViews[viewSignature];\n });\n }\n return view;\n });\n\n if (cachedViews) {\n cachedViews[viewSignature] = promiseForView;\n }\n return promiseForView;\n}\n\nconst persistentQueues = {};\nconst tempViewQueue = new TaskQueue();\nconst CHANGES_BATCH_SIZE = 50;\n\nfunction parseViewName(name) {\n // can be either 'ddocname/viewname' or just 'viewname'\n // (where the ddoc name is the same)\n return name.indexOf('/') === -1 ? [name, name] : name.split('/');\n}\n\nfunction isGenOne(changes) {\n // only return true if the current change is 1-\n // and there are no other leafs\n return changes.length === 1 && /^1-/.test(changes[0].rev);\n}\n\nfunction emitError(db, e, data) {\n try {\n db.emit('error', e);\n } catch (err) {\n guardedConsole('error',\n 'The user\\'s map/reduce function threw an uncaught error.\\n' +\n 'You can debug this error by doing:\\n' +\n 'myDatabase.on(\\'error\\', function (err) { debugger; });\\n' +\n 'Please double-check your map/reduce function.');\n guardedConsole('error', e, data);\n }\n}\n\n/**\n * Returns an \"abstract\" mapreduce object of the form:\n *\n * {\n * query: queryFun,\n * viewCleanup: viewCleanupFun\n * }\n *\n * Arguments are:\n *\n * localDoc: string\n * This is for the local doc that gets saved in order to track the\n * \"dependent\" DBs and clean them up for viewCleanup. It should be\n * unique, so that indexer plugins don't collide with each other.\n * mapper: function (mapFunDef, emit)\n * Returns a map function based on the mapFunDef, which in the case of\n * normal map/reduce is just the de-stringified function, but may be\n * something else, such as an object in the case of pouchdb-find.\n * reducer: function (reduceFunDef)\n * Ditto, but for reducing. Modules don't have to support reducing\n * (e.g. pouchdb-find).\n * ddocValidator: function (ddoc, viewName)\n * Throws an error if the ddoc or viewName is not valid.\n * This could be a way to communicate to the user that the configuration for the\n * indexer is invalid.\n */\nfunction createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) {\n\n function tryMap(db, fun, doc) {\n // emit an event if there was an error thrown by a map function.\n // putting try/catches in a single function also avoids deoptimizations.\n try {\n fun(doc);\n } catch (e) {\n emitError(db, e, {fun, doc});\n }\n }\n\n function tryReduce(db, fun, keys, values, rereduce) {\n // same as above, but returning the result or an error. there are two separate\n // functions to avoid extra memory allocations since the tryCode() case is used\n // for custom map functions (common) vs this function, which is only used for\n // custom reduce functions (rare)\n try {\n return {output : fun(keys, values, rereduce)};\n } catch (e) {\n emitError(db, e, {fun, keys, values, rereduce});\n return {error: e};\n }\n }\n\n function sortByKeyThenValue(x, y) {\n const keyCompare = collate(x.key, y.key);\n return keyCompare !== 0 ? keyCompare : collate(x.value, y.value);\n }\n\n function sliceResults(results, limit, skip) {\n skip = skip || 0;\n if (typeof limit === 'number') {\n return results.slice(skip, limit + skip);\n } else if (skip > 0) {\n return results.slice(skip);\n }\n return results;\n }\n\n function rowToDocId(row) {\n const val = row.value;\n // Users can explicitly specify a joined doc _id, or it\n // defaults to the doc _id that emitted the key/value.\n const docId = (val && typeof val === 'object' && val._id) || row.id;\n return docId;\n }\n\n function readAttachmentsAsBlobOrBuffer(res) {\n for (const row of res.rows) {\n const atts = row.doc && row.doc._attachments;\n if (!atts) {\n continue;\n }\n for (const filename of Object.keys(atts)) {\n const att = atts[filename];\n atts[filename].data = base64StringToBlobOrBuffer(att.data, att.content_type);\n }\n }\n }\n\n function postprocessAttachments(opts) {\n return function (res) {\n if (opts.include_docs && opts.attachments && opts.binary) {\n readAttachmentsAsBlobOrBuffer(res);\n }\n return res;\n };\n }\n\n function addHttpParam(paramName, opts, params, asJson) {\n // add an http param from opts to params, optionally json-encoded\n let val = opts[paramName];\n if (typeof val !== 'undefined') {\n if (asJson) {\n val = encodeURIComponent(JSON.stringify(val));\n }\n params.push(paramName + '=' + val);\n }\n }\n\n function coerceInteger(integerCandidate) {\n if (typeof integerCandidate !== 'undefined') {\n const asNumber = Number(integerCandidate);\n // prevents e.g. '1foo' or '1.1' being coerced to 1\n if (!isNaN(asNumber) && asNumber === parseInt(integerCandidate, 10)) {\n return asNumber;\n } else {\n return integerCandidate;\n }\n }\n }\n\n function coerceOptions(opts) {\n opts.group_level = coerceInteger(opts.group_level);\n opts.limit = coerceInteger(opts.limit);\n opts.skip = coerceInteger(opts.skip);\n return opts;\n }\n\n function checkPositiveInteger(number) {\n if (number) {\n if (typeof number !== 'number') {\n return new QueryParseError(`Invalid value for integer: \"${number}\"`);\n }\n if (number < 0) {\n return new QueryParseError(`Invalid value for positive integer: \"${number}\"`);\n }\n }\n }\n\n function checkQueryParseError(options, fun) {\n const startkeyName = options.descending ? 'endkey' : 'startkey';\n const endkeyName = options.descending ? 'startkey' : 'endkey';\n\n if (typeof options[startkeyName] !== 'undefined' &&\n typeof options[endkeyName] !== 'undefined' &&\n collate(options[startkeyName], options[endkeyName]) > 0) {\n throw new QueryParseError('No rows can match your key range, ' +\n 'reverse your start_key and end_key or set {descending : true}');\n } else if (fun.reduce && options.reduce !== false) {\n if (options.include_docs) {\n throw new QueryParseError('{include_docs:true} is invalid for reduce');\n } else if (options.keys && options.keys.length > 1 &&\n !options.group && !options.group_level) {\n throw new QueryParseError('Multi-key fetches for reduce views must use ' +\n '{group: true}');\n }\n }\n for (const optionName of ['group_level', 'limit', 'skip']) {\n const error = checkPositiveInteger(options[optionName]);\n if (error) {\n throw error;\n }\n }\n }\n\n async function httpQuery(db, fun, opts) {\n // List of parameters to add to the PUT request\n let params = [];\n let body;\n let method = 'GET';\n let ok;\n\n // If opts.reduce exists and is defined, then add it to the list\n // of parameters.\n // If reduce=false then the results are that of only the map function\n // not the final result of map and reduce.\n addHttpParam('reduce', opts, params);\n addHttpParam('include_docs', opts, params);\n addHttpParam('attachments', opts, params);\n addHttpParam('limit', opts, params);\n addHttpParam('descending', opts, params);\n addHttpParam('group', opts, params);\n addHttpParam('group_level', opts, params);\n addHttpParam('skip', opts, params);\n addHttpParam('stale', opts, params);\n addHttpParam('conflicts', opts, params);\n addHttpParam('startkey', opts, params, true);\n addHttpParam('start_key', opts, params, true);\n addHttpParam('endkey', opts, params, true);\n addHttpParam('end_key', opts, params, true);\n addHttpParam('inclusive_end', opts, params);\n addHttpParam('key', opts, params, true);\n addHttpParam('update_seq', opts, params);\n\n // Format the list of parameters into a valid URI query string\n params = params.join('&');\n params = params === '' ? '' : '?' + params;\n\n // If keys are supplied, issue a POST to circumvent GET query string limits\n // see http://wiki.apache.org/couchdb/HTTP_view_API#Querying_Options\n if (typeof opts.keys !== 'undefined') {\n const MAX_URL_LENGTH = 2000;\n // according to http://stackoverflow.com/a/417184/680742,\n // the de facto URL length limit is 2000 characters\n\n const keysAsString = `keys=${encodeURIComponent(JSON.stringify(opts.keys))}`;\n if (keysAsString.length + params.length + 1 <= MAX_URL_LENGTH) {\n // If the keys are short enough, do a GET. we do this to work around\n // Safari not understanding 304s on POSTs (see pouchdb/pouchdb#1239)\n params += (params[0] === '?' ? '&' : '?') + keysAsString;\n } else {\n method = 'POST';\n if (typeof fun === 'string') {\n body = {keys: opts.keys};\n } else { // fun is {map : mapfun}, so append to this\n fun.keys = opts.keys;\n }\n }\n }\n\n // We are referencing a query defined in the design doc\n if (typeof fun === 'string') {\n const parts = parseViewName(fun);\n\n const response = await db.fetch('_design/' + parts[0] + '/_view/' + parts[1] + params, {\n headers: new Headers({'Content-Type': 'application/json'}),\n method,\n body: JSON.stringify(body)\n });\n ok = response.ok;\n // status = response.status;\n const result = await response.json();\n\n if (!ok) {\n result.status = response.status;\n throw generateErrorFromResponse(result);\n }\n\n // fail the entire request if the result contains an error\n for (const row of result.rows) {\n /* istanbul ignore if */\n if (row.value && row.value.error && row.value.error === \"builtin_reduce_error\") {\n throw new Error(row.reason);\n }\n }\n\n return new Promise(function (resolve) {\n resolve(result);\n }).then(postprocessAttachments(opts));\n }\n\n // We are using a temporary view, terrible for performance, good for testing\n body = body || {};\n for (const key of Object.keys(fun)) {\n if (Array.isArray(fun[key])) {\n body[key] = fun[key];\n } else {\n body[key] = fun[key].toString();\n }\n }\n\n const response = await db.fetch('_temp_view' + params, {\n headers: new Headers({'Content-Type': 'application/json'}),\n method: 'POST',\n body: JSON.stringify(body)\n });\n\n ok = response.ok;\n // status = response.status;\n const result = await response.json();\n if (!ok) {\n result.status = response.status;\n throw generateErrorFromResponse(result);\n }\n\n return new Promise(function (resolve) {\n resolve(result);\n }).then(postprocessAttachments(opts));\n }\n\n // custom adapters can define their own api._query\n // and override the default behavior\n /* istanbul ignore next */\n function customQuery(db, fun, opts) {\n return new Promise(function (resolve, reject) {\n db._query(fun, opts, function (err, res) {\n if (err) {\n return reject(err);\n }\n resolve(res);\n });\n });\n }\n\n // custom adapters can define their own api._viewCleanup\n // and override the default behavior\n /* istanbul ignore next */\n function customViewCleanup(db) {\n return new Promise(function (resolve, reject) {\n db._viewCleanup(function (err, res) {\n if (err) {\n return reject(err);\n }\n resolve(res);\n });\n });\n }\n\n function defaultsTo(value) {\n return function (reason) {\n /* istanbul ignore else */\n if (reason.status === 404) {\n return value;\n } else {\n throw reason;\n }\n };\n }\n\n // returns a promise for a list of docs to update, based on the input docId.\n // the order doesn't matter, because post-3.2.0, bulkDocs\n // is an atomic operation in all three adapters.\n async function getDocsToPersist(docId, view, docIdsToChangesAndEmits) {\n const metaDocId = '_local/doc_' + docId;\n const defaultMetaDoc = {_id: metaDocId, keys: []};\n const docData = docIdsToChangesAndEmits.get(docId);\n const indexableKeysToKeyValues = docData[0];\n const changes = docData[1];\n\n function getMetaDoc() {\n if (isGenOne(changes)) {\n // generation 1, so we can safely assume initial state\n // for performance reasons (avoids unnecessary GETs)\n return Promise.resolve(defaultMetaDoc);\n }\n return view.db.get(metaDocId).catch(defaultsTo(defaultMetaDoc));\n }\n\n function getKeyValueDocs(metaDoc) {\n if (!metaDoc.keys.length) {\n // no keys, no need for a lookup\n return Promise.resolve({rows: []});\n }\n return view.db.allDocs({\n keys: metaDoc.keys,\n include_docs: true\n });\n }\n\n function processKeyValueDocs(metaDoc, kvDocsRes) {\n const kvDocs = [];\n const oldKeys = new Set();\n\n for (const row of kvDocsRes.rows) {\n const doc = row.doc;\n if (!doc) { // deleted\n continue;\n }\n kvDocs.push(doc);\n oldKeys.add(doc._id);\n doc._deleted = !indexableKeysToKeyValues.has(doc._id);\n if (!doc._deleted) {\n const keyValue = indexableKeysToKeyValues.get(doc._id);\n if ('value' in keyValue) {\n doc.value = keyValue.value;\n }\n }\n }\n const newKeys = mapToKeysArray(indexableKeysToKeyValues);\n for (const key of newKeys) {\n if (!oldKeys.has(key)) {\n // new doc\n const kvDoc = {\n _id: key\n };\n const keyValue = indexableKeysToKeyValues.get(key);\n if ('value' in keyValue) {\n kvDoc.value = keyValue.value;\n }\n kvDocs.push(kvDoc);\n }\n }\n metaDoc.keys = uniq(newKeys.concat(metaDoc.keys));\n kvDocs.push(metaDoc);\n\n return kvDocs;\n }\n\n const metaDoc = await getMetaDoc();\n const keyValueDocs = await getKeyValueDocs(metaDoc);\n return processKeyValueDocs(metaDoc, keyValueDocs);\n }\n\n function updatePurgeSeq(view) {\n // with this approach, we just assume to have processed all missing purges and write the latest\n // purgeSeq into the _local/purgeSeq doc.\n return view.sourceDB.get('_local/purges').then(function (res) {\n const purgeSeq = res.purgeSeq;\n return view.db.get('_local/purgeSeq').then(function (res) {\n return res._rev;\n })\n .catch(defaultsTo(undefined))\n .then(function (rev) {\n return view.db.put({\n _id: '_local/purgeSeq',\n _rev: rev,\n purgeSeq,\n });\n });\n }).catch(function (err) {\n if (err.status !== 404) {\n throw err;\n }\n });\n }\n\n // updates all emitted key/value docs and metaDocs in the mrview database\n // for the given batch of documents from the source database\n function saveKeyValues(view, docIdsToChangesAndEmits, seq) {\n var seqDocId = '_local/lastSeq';\n return view.db.get(seqDocId)\n .catch(defaultsTo({_id: seqDocId, seq: 0}))\n .then(function (lastSeqDoc) {\n var docIds = mapToKeysArray(docIdsToChangesAndEmits);\n return Promise.all(docIds.map(function (docId) {\n return getDocsToPersist(docId, view, docIdsToChangesAndEmits);\n })).then(function (listOfDocsToPersist) {\n var docsToPersist = listOfDocsToPersist.flat();\n lastSeqDoc.seq = seq;\n docsToPersist.push(lastSeqDoc);\n // write all docs in a single operation, update the seq once\n return view.db.bulkDocs({docs : docsToPersist});\n })\n // TODO: this should be placed somewhere else, probably? we're querying both docs twice\n // (first time when getting the actual purges).\n .then(() => updatePurgeSeq(view));\n });\n }\n\n function getQueue(view) {\n const viewName = typeof view === 'string' ? view : view.name;\n let queue = persistentQueues[viewName];\n if (!queue) {\n queue = persistentQueues[viewName] = new TaskQueue();\n }\n return queue;\n }\n\n async function updateView(view, opts) {\n return sequentialize(getQueue(view), function () {\n return updateViewInQueue(view, opts);\n })();\n }\n\n async function updateViewInQueue(view, opts) {\n // bind the emit function once\n let mapResults;\n let doc;\n let taskId;\n\n function emit(key, value) {\n const output = {id: doc._id, key: normalizeKey(key)};\n // Don't explicitly store the value unless it's defined and non-null.\n // This saves on storage space, because often people don't use it.\n if (typeof value !== 'undefined' && value !== null) {\n output.value = normalizeKey(value);\n }\n mapResults.push(output);\n }\n\n const mapFun = mapper(view.mapFun, emit);\n\n let currentSeq = view.seq || 0;\n\n function createTask() {\n return view.sourceDB.info().then(function (info) {\n taskId = view.sourceDB.activeTasks.add({\n name: 'view_indexing',\n total_items: info.update_seq - currentSeq,\n });\n });\n }\n\n function processChange(docIdsToChangesAndEmits, seq) {\n return function () {\n return saveKeyValues(view, docIdsToChangesAndEmits, seq);\n };\n }\n\n let indexed_docs = 0;\n const progress = {\n view: view.name,\n indexed_docs\n };\n view.sourceDB.emit('indexing', progress);\n\n const queue = new TaskQueue();\n\n async function processNextBatch() {\n const response = await view.sourceDB.changes({\n return_docs: true,\n conflicts: true,\n include_docs: true,\n style: 'all_docs',\n since: currentSeq,\n limit: opts.changes_batch_size\n });\n const purges = await getRecentPurges();\n return processBatch(response, purges);\n }\n\n function getRecentPurges() {\n return view.db.get('_local/purgeSeq').then(function (res) {\n return res.purgeSeq;\n })\n .catch(defaultsTo(-1))\n .then(function (purgeSeq) {\n return view.sourceDB.get('_local/purges').then(function (res) {\n const recentPurges = res.purges.filter(function (purge, index) {\n return index > purgeSeq;\n }).map((purge) => purge.docId);\n\n const uniquePurges = recentPurges.filter(function (docId, index) {\n return recentPurges.indexOf(docId) === index;\n });\n\n return Promise.all(uniquePurges.map(function (docId) {\n return view.sourceDB.get(docId).then(function (doc) {\n return { docId, doc };\n })\n .catch(defaultsTo({ docId }));\n }));\n })\n .catch(defaultsTo([]));\n });\n }\n\n function processBatch(response, purges) {\n const results = response.results;\n if (!results.length && !purges.length) {\n return;\n }\n\n for (const purge of purges) {\n const index = results.findIndex(function (change) {\n return change.id === purge.docId;\n });\n if (index < 0) {\n // mimic a db.remove() on the changes feed\n const entry = {\n _id: purge.docId,\n doc: {\n _id: purge.docId,\n _deleted: 1,\n },\n changes: [],\n };\n\n if (purge.doc) {\n // update with new winning rev after purge\n entry.doc = purge.doc;\n entry.changes.push({ rev: purge.doc._rev });\n }\n\n results.push(entry);\n }\n }\n\n const docIdsToChangesAndEmits = createDocIdsToChangesAndEmits(results);\n\n queue.add(processChange(docIdsToChangesAndEmits, currentSeq));\n\n indexed_docs = indexed_docs + results.length;\n const progress = {\n view: view.name,\n last_seq: response.last_seq,\n results_count: results.length,\n indexed_docs\n };\n view.sourceDB.emit('indexing', progress);\n view.sourceDB.activeTasks.update(taskId, {completed_items: indexed_docs});\n\n if (results.length < opts.changes_batch_size) {\n return;\n }\n return processNextBatch();\n }\n\n function createDocIdsToChangesAndEmits(results) {\n const docIdsToChangesAndEmits = new Map();\n for (const change of results) {\n if (change.doc._id[0] !== '_') {\n mapResults = [];\n doc = change.doc;\n\n if (!doc._deleted) {\n tryMap(view.sourceDB, mapFun, doc);\n }\n mapResults.sort(sortByKeyThenValue);\n\n const indexableKeysToKeyValues = createIndexableKeysToKeyValues(mapResults);\n docIdsToChangesAndEmits.set(change.doc._id, [\n indexableKeysToKeyValues,\n change.changes\n ]);\n }\n currentSeq = change.seq;\n }\n return docIdsToChangesAndEmits;\n }\n\n function createIndexableKeysToKeyValues(mapResults) {\n const indexableKeysToKeyValues = new Map();\n let lastKey;\n for (let i = 0, len = mapResults.length; i < len; i++) {\n const emittedKeyValue = mapResults[i];\n const complexKey = [emittedKeyValue.key, emittedKeyValue.id];\n if (i > 0 && collate(emittedKeyValue.key, lastKey) === 0) {\n complexKey.push(i); // dup key+id, so make it unique\n }\n indexableKeysToKeyValues.set(toIndexableString(complexKey), emittedKeyValue);\n lastKey = emittedKeyValue.key;\n }\n return indexableKeysToKeyValues;\n }\n\n try {\n await createTask();\n await processNextBatch();\n await queue.finish();\n view.seq = currentSeq;\n view.sourceDB.activeTasks.remove(taskId);\n } catch (error) {\n view.sourceDB.activeTasks.remove(taskId, error);\n }\n }\n\n function reduceView(view, results, options) {\n if (options.group_level === 0) {\n delete options.group_level;\n }\n\n const shouldGroup = options.group || options.group_level;\n const reduceFun = reducer(view.reduceFun);\n const groups = [];\n const lvl = isNaN(options.group_level)\n ? Number.POSITIVE_INFINITY\n : options.group_level;\n\n for (const result of results) {\n const last = groups[groups.length - 1];\n let groupKey = shouldGroup ? result.key : null;\n\n // only set group_level for array keys\n if (shouldGroup && Array.isArray(groupKey)) {\n groupKey = groupKey.slice(0, lvl);\n }\n\n if (last && collate(last.groupKey, groupKey) === 0) {\n last.keys.push([result.key, result.id]);\n last.values.push(result.value);\n continue;\n }\n groups.push({\n keys: [[result.key, result.id]],\n values: [result.value],\n groupKey\n });\n }\n\n results = [];\n for (const group of groups) {\n const reduceTry = tryReduce(view.sourceDB, reduceFun, group.keys, group.values, false);\n if (reduceTry.error && reduceTry.error instanceof BuiltInError) {\n // CouchDB returns an error if a built-in errors out\n throw reduceTry.error;\n }\n results.push({\n // CouchDB just sets the value to null if a non-built-in errors out\n value: reduceTry.error ? null : reduceTry.output,\n key: group.groupKey\n });\n }\n // no total_rows/offset when reducing\n return { rows: sliceResults(results, options.limit, options.skip) };\n }\n\n function queryView(view, opts) {\n return sequentialize(getQueue(view), function () {\n return queryViewInQueue(view, opts);\n })();\n }\n\n async function queryViewInQueue(view, opts) {\n let totalRows;\n const shouldReduce = view.reduceFun && opts.reduce !== false;\n const skip = opts.skip || 0;\n if (typeof opts.keys !== 'undefined' && !opts.keys.length) {\n // equivalent query\n opts.limit = 0;\n delete opts.keys;\n }\n\n async function fetchFromView(viewOpts) {\n viewOpts.include_docs = true;\n const res = await view.db.allDocs(viewOpts);\n totalRows = res.total_rows;\n\n return res.rows.map(function (result) {\n // implicit migration - in older versions of PouchDB,\n // we explicitly stored the doc as {id: ..., key: ..., value: ...}\n // this is tested in a migration test\n /* istanbul ignore next */\n if ('value' in result.doc && typeof result.doc.value === 'object' &&\n result.doc.value !== null) {\n const keys = Object.keys(result.doc.value).sort();\n // this detection method is not perfect, but it's unlikely the user\n // emitted a value which was an object with these 3 exact keys\n const expectedKeys = ['id', 'key', 'value'];\n if (!(keys < expectedKeys || keys > expectedKeys)) {\n return result.doc.value;\n }\n }\n\n const parsedKeyAndDocId = parseIndexableString(result.doc._id);\n return {\n key: parsedKeyAndDocId[0],\n id: parsedKeyAndDocId[1],\n value: ('value' in result.doc ? result.doc.value : null)\n };\n });\n }\n\n async function onMapResultsReady(rows) {\n let finalResults;\n if (shouldReduce) {\n finalResults = reduceView(view, rows, opts);\n } else if (typeof opts.keys === 'undefined') {\n finalResults = {\n total_rows: totalRows,\n offset: skip,\n rows\n };\n } else {\n // support limit, skip for keys query\n finalResults = {\n total_rows: totalRows,\n offset: skip,\n rows: sliceResults(rows,opts.limit,opts.skip)\n };\n }\n /* istanbul ignore if */\n if (opts.update_seq) {\n finalResults.update_seq = view.seq;\n }\n if (opts.include_docs) {\n const docIds = uniq(rows.map(rowToDocId));\n\n const allDocsRes = await view.sourceDB.allDocs({\n keys: docIds,\n include_docs: true,\n conflicts: opts.conflicts,\n attachments: opts.attachments,\n binary: opts.binary\n });\n const docIdsToDocs = new Map();\n for (const row of allDocsRes.rows) {\n docIdsToDocs.set(row.id, row.doc);\n }\n for (const row of rows) {\n const docId = rowToDocId(row);\n const doc = docIdsToDocs.get(docId);\n if (doc) {\n row.doc = doc;\n }\n }\n }\n return finalResults;\n }\n\n if (typeof opts.keys !== 'undefined') {\n const keys = opts.keys;\n const fetchPromises = keys.map(function (key) {\n const viewOpts = {\n startkey : toIndexableString([key]),\n endkey : toIndexableString([key, {}])\n };\n /* istanbul ignore if */\n if (opts.update_seq) {\n viewOpts.update_seq = true;\n }\n return fetchFromView(viewOpts);\n });\n const result = await Promise.all(fetchPromises);\n const flattenedResult = result.flat();\n return onMapResultsReady(flattenedResult);\n } else { // normal query, no 'keys'\n const viewOpts = {\n descending : opts.descending\n };\n /* istanbul ignore if */\n if (opts.update_seq) {\n viewOpts.update_seq = true;\n }\n let startkey;\n let endkey;\n if ('start_key' in opts) {\n startkey = opts.start_key;\n }\n if ('startkey' in opts) {\n startkey = opts.startkey;\n }\n if ('end_key' in opts) {\n endkey = opts.end_key;\n }\n if ('endkey' in opts) {\n endkey = opts.endkey;\n }\n if (typeof startkey !== 'undefined') {\n viewOpts.startkey = opts.descending ?\n toIndexableString([startkey, {}]) :\n toIndexableString([startkey]);\n }\n if (typeof endkey !== 'undefined') {\n let inclusiveEnd = opts.inclusive_end !== false;\n if (opts.descending) {\n inclusiveEnd = !inclusiveEnd;\n }\n\n viewOpts.endkey = toIndexableString(\n inclusiveEnd ? [endkey, {}] : [endkey]);\n }\n if (typeof opts.key !== 'undefined') {\n const keyStart = toIndexableString([opts.key]);\n const keyEnd = toIndexableString([opts.key, {}]);\n if (viewOpts.descending) {\n viewOpts.endkey = keyStart;\n viewOpts.startkey = keyEnd;\n } else {\n viewOpts.startkey = keyStart;\n viewOpts.endkey = keyEnd;\n }\n }\n if (!shouldReduce) {\n if (typeof opts.limit === 'number') {\n viewOpts.limit = opts.limit;\n }\n viewOpts.skip = skip;\n }\n\n const result = await fetchFromView(viewOpts);\n return onMapResultsReady(result);\n }\n }\n\n async function httpViewCleanup(db) {\n const response = await db.fetch('_view_cleanup', {\n headers: new Headers({'Content-Type': 'application/json'}),\n method: 'POST'\n });\n return response.json();\n }\n\n async function localViewCleanup(db) {\n try {\n const metaDoc = await db.get('_local/' + localDocName);\n const docsToViews = new Map();\n\n for (const fullViewName of Object.keys(metaDoc.views)) {\n const parts = parseViewName(fullViewName);\n const designDocName = '_design/' + parts[0];\n const viewName = parts[1];\n let views = docsToViews.get(designDocName);\n if (!views) {\n views = new Set();\n docsToViews.set(designDocName, views);\n }\n views.add(viewName);\n }\n const opts = {\n keys : mapToKeysArray(docsToViews),\n include_docs : true\n };\n\n const res = await db.allDocs(opts);\n const viewsToStatus = {};\n for (const row of res.rows) {\n const ddocName = row.key.substring(8); // cuts off '_design/'\n for (const viewName of docsToViews.get(row.key)) {\n let fullViewName = ddocName + '/' + viewName;\n /* istanbul ignore if */\n if (!metaDoc.views[fullViewName]) {\n // new format, without slashes, to support PouchDB 2.2.0\n // migration test in pouchdb's browser.migration.js verifies this\n fullViewName = viewName;\n }\n const viewDBNames = Object.keys(metaDoc.views[fullViewName]);\n // design doc deleted, or view function nonexistent\n const statusIsGood = row.doc && row.doc.views &&\n row.doc.views[viewName];\n for (const viewDBName of viewDBNames) {\n viewsToStatus[viewDBName] = viewsToStatus[viewDBName] || statusIsGood;\n }\n }\n }\n\n const dbsToDelete = Object.keys(viewsToStatus)\n .filter(function (viewDBName) { return !viewsToStatus[viewDBName]; });\n\n const destroyPromises = dbsToDelete.map(function (viewDBName) {\n return sequentialize(getQueue(viewDBName), function () {\n return new db.constructor(viewDBName, db.__opts).destroy();\n })();\n });\n\n return Promise.all(destroyPromises).then(function () {\n return {ok: true};\n });\n } catch (err) {\n if (err.status === 404) {\n return {ok: true};\n } else {\n throw err;\n }\n }\n }\n\n async function queryPromised(db, fun, opts) {\n /* istanbul ignore next */\n if (typeof db._query === 'function') {\n return customQuery(db, fun, opts);\n }\n if (isRemote(db)) {\n return httpQuery(db, fun, opts);\n }\n\n const updateViewOpts = {\n changes_batch_size: db.__opts.view_update_changes_batch_size || CHANGES_BATCH_SIZE\n };\n\n if (typeof fun !== 'string') {\n // temp_view\n checkQueryParseError(opts, fun);\n\n tempViewQueue.add(async function () {\n const view = await createView(\n /* sourceDB */ db,\n /* viewName */ 'temp_view/temp_view',\n /* mapFun */ fun.map,\n /* reduceFun */ fun.reduce,\n /* temporary */ true,\n /* localDocName */ localDocName);\n\n return fin(updateView(view, updateViewOpts).then(\n function () { return queryView(view, opts); }),\n function () { return view.db.destroy(); }\n );\n });\n return tempViewQueue.finish();\n } else {\n // persistent view\n const fullViewName = fun;\n const parts = parseViewName(fullViewName);\n const designDocName = parts[0];\n const viewName = parts[1];\n\n const doc = await db.get('_design/' + designDocName);\n fun = doc.views && doc.views[viewName];\n\n if (!fun) {\n // basic validator; it's assumed that every subclass would want this\n throw new NotFoundError(`ddoc ${doc._id} has no view named ${viewName}`);\n }\n\n ddocValidator(doc, viewName);\n checkQueryParseError(opts, fun);\n\n const view = await createView(\n /* sourceDB */ db,\n /* viewName */ fullViewName,\n /* mapFun */ fun.map,\n /* reduceFun */ fun.reduce,\n /* temporary */ false,\n /* localDocName */ localDocName);\n\n if (opts.stale === 'ok' || opts.stale === 'update_after') {\n if (opts.stale === 'update_after') {\n nextTick(function () {\n updateView(view, updateViewOpts);\n });\n }\n return queryView(view, opts);\n } else { // stale not ok\n await updateView(view, updateViewOpts);\n return queryView(view, opts);\n }\n }\n }\n\n function abstractQuery(fun, opts, callback) {\n const db = this;\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n opts = opts ? coerceOptions(opts) : {};\n\n if (typeof fun === 'function') {\n fun = {map : fun};\n }\n\n const promise = Promise.resolve().then(function () {\n return queryPromised(db, fun, opts);\n });\n promisedCallback(promise, callback);\n return promise;\n }\n\n const abstractViewCleanup = callbackify(function () {\n const db = this;\n /* istanbul ignore next */\n if (typeof db._viewCleanup === 'function') {\n return customViewCleanup(db);\n }\n if (isRemote(db)) {\n return httpViewCleanup(db);\n }\n return localViewCleanup(db);\n });\n\n return {\n query: abstractQuery,\n viewCleanup: abstractViewCleanup\n };\n}\n\nexport default createAbstractMapReduce;\n","import { clone } from 'pouchdb-utils';\nimport { collate } from 'pouchdb-collate';\n\n// this would just be \"return doc[field]\", but fields\n// can be \"deep\" due to dot notation\nfunction getFieldFromDoc(doc, parsedField) {\n var value = doc;\n for (var i = 0, len = parsedField.length; i < len; i++) {\n var key = parsedField[i];\n value = value[key];\n if (!value) {\n break;\n }\n }\n return value;\n}\n\nfunction setFieldInDoc(doc, parsedField, value) {\n for (var i = 0, len = parsedField.length; i < len-1; i++) {\n var elem = parsedField[i];\n doc = doc[elem] = doc[elem] || {};\n }\n doc[parsedField[len-1]] = value;\n}\n\nfunction compare(left, right) {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\n// Converts a string in dot notation to an array of its components, with backslash escaping\nfunction parseField(fieldName) {\n // fields may be deep (e.g. \"foo.bar.baz\"), so parse\n var fields = [];\n var current = '';\n for (var i = 0, len = fieldName.length; i < len; i++) {\n var ch = fieldName[i];\n if (i > 0 && fieldName[i - 1] === '\\\\' && (ch === '$' || ch === '.')) {\n // escaped delimiter\n current = current.substring(0, current.length - 1) + ch;\n } else if (ch === '.') {\n // When `.` is not escaped (above), it is a field delimiter\n fields.push(current);\n current = '';\n } else { // normal character\n current += ch;\n }\n }\n fields.push(current);\n return fields;\n}\n\nvar combinationFields = ['$or', '$nor', '$not'];\nfunction isCombinationalField(field) {\n return combinationFields.indexOf(field) > -1;\n}\n\nfunction getKey(obj) {\n return Object.keys(obj)[0];\n}\n\nfunction getValue(obj) {\n return obj[getKey(obj)];\n}\n\n\n// flatten an array of selectors joined by an $and operator\nfunction mergeAndedSelectors(selectors) {\n\n // sort to ensure that e.g. if the user specified\n // $and: [{$gt: 'a'}, {$gt: 'b'}], then it's collapsed into\n // just {$gt: 'b'}\n var res = {};\n var first = {$or: true, $nor: true};\n\n selectors.forEach(function (selector) {\n Object.keys(selector).forEach(function (field) {\n var matcher = selector[field];\n if (typeof matcher !== 'object') {\n matcher = {$eq: matcher};\n }\n\n if (isCombinationalField(field)) {\n // or, nor\n if (matcher instanceof Array) {\n if (first[field]) {\n first[field] = false;\n res[field] = matcher;\n return;\n }\n\n var entries = [];\n res[field].forEach(function (existing) {\n Object.keys(matcher).forEach(function (key) {\n var m = matcher[key];\n var longest = Math.max(Object.keys(existing).length, Object.keys(m).length);\n var merged = mergeAndedSelectors([existing, m]);\n if (Object.keys(merged).length <= longest) {\n // we have a situation like: (a :{$eq :1} || ...) && (a {$eq: 2} || ...)\n // merging would produce a $eq 2 when actually we shouldn't ever match against these merged conditions\n // merged should always contain more values to be valid\n return;\n }\n entries.push(merged);\n });\n });\n res[field] = entries;\n } else {\n // not\n res[field] = mergeAndedSelectors([matcher]);\n }\n } else {\n var fieldMatchers = res[field] = res[field] || {};\n Object.keys(matcher).forEach(function (operator) {\n var value = matcher[operator];\n\n if (operator === '$gt' || operator === '$gte') {\n return mergeGtGte(operator, value, fieldMatchers);\n } else if (operator === '$lt' || operator === '$lte') {\n return mergeLtLte(operator, value, fieldMatchers);\n } else if (operator === '$ne') {\n return mergeNe(value, fieldMatchers);\n } else if (operator === '$eq') {\n return mergeEq(value, fieldMatchers);\n } else if (operator === \"$regex\") {\n return mergeRegex(value, fieldMatchers);\n }\n fieldMatchers[operator] = value;\n });\n }\n });\n });\n\n return res;\n}\n\n\n\n// collapse logically equivalent gt/gte values\nfunction mergeGtGte(operator, value, fieldMatchers) {\n if (typeof fieldMatchers.$eq !== 'undefined') {\n return; // do nothing\n }\n if (typeof fieldMatchers.$gte !== 'undefined') {\n if (operator === '$gte') {\n if (value > fieldMatchers.$gte) { // more specificity\n fieldMatchers.$gte = value;\n }\n } else { // operator === '$gt'\n if (value >= fieldMatchers.$gte) { // more specificity\n delete fieldMatchers.$gte;\n fieldMatchers.$gt = value;\n }\n }\n } else if (typeof fieldMatchers.$gt !== 'undefined') {\n if (operator === '$gte') {\n if (value > fieldMatchers.$gt) { // more specificity\n delete fieldMatchers.$gt;\n fieldMatchers.$gte = value;\n }\n } else { // operator === '$gt'\n if (value > fieldMatchers.$gt) { // more specificity\n fieldMatchers.$gt = value;\n }\n }\n } else {\n fieldMatchers[operator] = value;\n }\n}\n\n// collapse logically equivalent lt/lte values\nfunction mergeLtLte(operator, value, fieldMatchers) {\n if (typeof fieldMatchers.$eq !== 'undefined') {\n return; // do nothing\n }\n if (typeof fieldMatchers.$lte !== 'undefined') {\n if (operator === '$lte') {\n if (value < fieldMatchers.$lte) { // more specificity\n fieldMatchers.$lte = value;\n }\n } else { // operator === '$gt'\n if (value <= fieldMatchers.$lte) { // more specificity\n delete fieldMatchers.$lte;\n fieldMatchers.$lt = value;\n }\n }\n } else if (typeof fieldMatchers.$lt !== 'undefined') {\n if (operator === '$lte') {\n if (value < fieldMatchers.$lt) { // more specificity\n delete fieldMatchers.$lt;\n fieldMatchers.$lte = value;\n }\n } else { // operator === '$gt'\n if (value < fieldMatchers.$lt) { // more specificity\n fieldMatchers.$lt = value;\n }\n }\n } else {\n fieldMatchers[operator] = value;\n }\n}\n\n// combine $ne values into one array\nfunction mergeNe(value, fieldMatchers) {\n if ('$ne' in fieldMatchers) {\n // there are many things this could \"not\" be\n fieldMatchers.$ne.push(value);\n } else { // doesn't exist yet\n fieldMatchers.$ne = [value];\n }\n}\n\n// add $eq into the mix\nfunction mergeEq(value, fieldMatchers) {\n // these all have less specificity than the $eq\n // TODO: check for user errors here\n delete fieldMatchers.$gt;\n delete fieldMatchers.$gte;\n delete fieldMatchers.$lt;\n delete fieldMatchers.$lte;\n delete fieldMatchers.$ne;\n fieldMatchers.$eq = value;\n}\n\n// combine $regex values into one array\nfunction mergeRegex(value, fieldMatchers) {\n if ('$regex' in fieldMatchers) {\n // a value could match multiple regexes\n fieldMatchers.$regex.push(value);\n } else { // doesn't exist yet\n fieldMatchers.$regex = [value];\n }\n}\n\n//#7458: execute function mergeAndedSelectors on nested $and\nfunction mergeAndedSelectorsNested(obj) {\n for (var prop in obj) {\n if (Array.isArray(obj)) {\n for (var i in obj) {\n if (obj[i]['$and']) {\n obj[i] = mergeAndedSelectors(obj[i]['$and']);\n }\n }\n }\n var value = obj[prop];\n if (typeof value === 'object') {\n mergeAndedSelectorsNested(value); // <- recursive call\n }\n }\n return obj;\n}\n\n//#7458: determine id $and is present in selector (at any level)\nfunction isAndInSelector(obj, isAnd) {\n for (var prop in obj) {\n if (prop === '$and') {\n isAnd = true;\n }\n var value = obj[prop];\n if (typeof value === 'object') {\n isAnd = isAndInSelector(value, isAnd); // <- recursive call\n }\n }\n return isAnd;\n}\n\n//\n// normalize the selector\n//\nfunction massageSelector(input) {\n var result = clone(input);\n\n //#7458: if $and is present in selector (at any level) merge nested $and\n if (isAndInSelector(result, false)) {\n result = mergeAndedSelectorsNested(result);\n if ('$and' in result) {\n result = mergeAndedSelectors(result['$and']);\n }\n }\n\n ['$or', '$nor'].forEach(function (orOrNor) {\n if (orOrNor in result) {\n // message each individual selector\n // e.g. {foo: 'bar'} becomes {foo: {$eq: 'bar'}}\n result[orOrNor].forEach(function (subSelector) {\n var fields = Object.keys(subSelector);\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n var matcher = subSelector[field];\n if (typeof matcher !== 'object' || matcher === null) {\n subSelector[field] = {$eq: matcher};\n }\n }\n });\n }\n });\n\n if ('$not' in result) {\n //This feels a little like forcing, but it will work for now,\n //I would like to come back to this and make the merging of selectors a little more generic\n result['$not'] = mergeAndedSelectors([result['$not']]);\n }\n\n var fields = Object.keys(result);\n\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n var matcher = result[field];\n\n if (typeof matcher !== 'object' || matcher === null) {\n matcher = {$eq: matcher};\n }\n result[field] = matcher;\n }\n\n normalizeArrayOperators(result);\n\n return result;\n}\n\n//\n// The $ne and $regex values must be placed in an array because these operators can be used multiple times on the same field.\n// When $and is used, mergeAndedSelectors takes care of putting some of them into arrays, otherwise it's done here.\n//\nfunction normalizeArrayOperators(selector) {\n Object.keys(selector).forEach(function (field) {\n var matcher = selector[field];\n\n if (Array.isArray(matcher)) {\n matcher.forEach(function (matcherItem) {\n if (matcherItem && typeof matcherItem === 'object') {\n normalizeArrayOperators(matcherItem);\n }\n });\n } else if (field === '$ne') {\n selector.$ne = [matcher];\n } else if (field === '$regex') {\n selector.$regex = [matcher];\n } else if (matcher && typeof matcher === 'object') {\n normalizeArrayOperators(matcher);\n }\n });\n}\n\n// create a comparator based on the sort object\nfunction createFieldSorter(sort) {\n\n function getFieldValuesAsArray(doc) {\n return sort.map(function (sorting) {\n var fieldName = getKey(sorting);\n var parsedField = parseField(fieldName);\n var docFieldValue = getFieldFromDoc(doc, parsedField);\n return docFieldValue;\n });\n }\n\n return function (aRow, bRow) {\n var aFieldValues = getFieldValuesAsArray(aRow.doc);\n var bFieldValues = getFieldValuesAsArray(bRow.doc);\n var collation = collate(aFieldValues, bFieldValues);\n if (collation !== 0) {\n return collation;\n }\n // this is what mango seems to do\n return compare(aRow.doc._id, bRow.doc._id);\n };\n}\n\nfunction filterInMemoryFields(rows, requestDef, inMemoryFields) {\n rows = rows.filter(function (row) {\n return rowFilter(row.doc, requestDef.selector, inMemoryFields);\n });\n\n if (requestDef.sort) {\n // in-memory sort\n var fieldSorter = createFieldSorter(requestDef.sort);\n rows = rows.sort(fieldSorter);\n if (typeof requestDef.sort[0] !== 'string' &&\n getValue(requestDef.sort[0]) === 'desc') {\n rows = rows.reverse();\n }\n }\n\n if ('limit' in requestDef || 'skip' in requestDef) {\n // have to do the limit in-memory\n var skip = requestDef.skip || 0;\n var limit = ('limit' in requestDef ? requestDef.limit : rows.length) + skip;\n rows = rows.slice(skip, limit);\n }\n return rows;\n}\n\nfunction rowFilter(doc, selector, inMemoryFields) {\n return inMemoryFields.every(function (field) {\n var matcher = selector[field];\n var parsedField = parseField(field);\n var docFieldValue = getFieldFromDoc(doc, parsedField);\n if (isCombinationalField(field)) {\n return matchCominationalSelector(field, matcher, doc);\n }\n\n return matchSelector(matcher, doc, parsedField, docFieldValue);\n });\n}\n\nfunction matchSelector(matcher, doc, parsedField, docFieldValue) {\n if (!matcher) {\n // no filtering necessary; this field is just needed for sorting\n return true;\n }\n\n // is matcher an object, if so continue recursion\n if (typeof matcher === 'object') {\n return Object.keys(matcher).every(function (maybeUserOperator) {\n var userValue = matcher[ maybeUserOperator ];\n // explicit operator\n if (maybeUserOperator.indexOf(\"$\") === 0) {\n return match(maybeUserOperator, doc, userValue, parsedField, docFieldValue);\n } else {\n var subParsedField = parseField(maybeUserOperator);\n\n if (\n docFieldValue === undefined &&\n typeof userValue !== \"object\" &&\n subParsedField.length > 0\n ) {\n // the field does not exist, return or getFieldFromDoc will throw\n return false;\n }\n\n var subDocFieldValue = getFieldFromDoc(docFieldValue, subParsedField);\n\n if (typeof userValue === \"object\") {\n // field value is an object that might contain more operators\n return matchSelector(userValue, doc, parsedField, subDocFieldValue);\n }\n\n // implicit operator\n return match(\"$eq\", doc, userValue, subParsedField, subDocFieldValue);\n }\n });\n }\n\n // no more depth, No need to recurse further\n return matcher === docFieldValue;\n}\n\nfunction matchCominationalSelector(field, matcher, doc) {\n\n if (field === '$or') {\n return matcher.some(function (orMatchers) {\n return rowFilter(doc, orMatchers, Object.keys(orMatchers));\n });\n }\n\n if (field === '$not') {\n return !rowFilter(doc, matcher, Object.keys(matcher));\n }\n\n //`$nor`\n return !matcher.find(function (orMatchers) {\n return rowFilter(doc, orMatchers, Object.keys(orMatchers));\n });\n\n}\n\nfunction match(userOperator, doc, userValue, parsedField, docFieldValue) {\n if (!matchers[userOperator]) {\n /* istanbul ignore next */\n throw new Error('unknown operator \"' + userOperator +\n '\" - should be one of $eq, $lte, $lt, $gt, $gte, $exists, $ne, $in, ' +\n '$nin, $size, $mod, $regex, $elemMatch, $type, $allMatch or $all');\n }\n return matchers[userOperator](doc, userValue, parsedField, docFieldValue);\n}\n\nfunction fieldExists(docFieldValue) {\n return typeof docFieldValue !== 'undefined' && docFieldValue !== null;\n}\n\nfunction fieldIsNotUndefined(docFieldValue) {\n return typeof docFieldValue !== 'undefined';\n}\n\nfunction modField(docFieldValue, userValue) {\n if (typeof docFieldValue !== \"number\" ||\n parseInt(docFieldValue, 10) !== docFieldValue) {\n return false;\n }\n\n var divisor = userValue[0];\n var mod = userValue[1];\n\n return docFieldValue % divisor === mod;\n}\n\nfunction arrayContainsValue(docFieldValue, userValue) {\n return userValue.some(function (val) {\n if (docFieldValue instanceof Array) {\n return docFieldValue.some(function (docFieldValueItem) {\n return collate(val, docFieldValueItem) === 0;\n });\n }\n\n return collate(val, docFieldValue) === 0;\n });\n}\n\nfunction arrayContainsAllValues(docFieldValue, userValue) {\n return userValue.every(function (val) {\n return docFieldValue.some(function (docFieldValueItem) {\n return collate(val, docFieldValueItem) === 0;\n });\n });\n}\n\nfunction arraySize(docFieldValue, userValue) {\n return docFieldValue.length === userValue;\n}\n\nfunction regexMatch(docFieldValue, userValue) {\n var re = new RegExp(userValue);\n\n return re.test(docFieldValue);\n}\n\nfunction typeMatch(docFieldValue, userValue) {\n\n switch (userValue) {\n case 'null':\n return docFieldValue === null;\n case 'boolean':\n return typeof (docFieldValue) === 'boolean';\n case 'number':\n return typeof (docFieldValue) === 'number';\n case 'string':\n return typeof (docFieldValue) === 'string';\n case 'array':\n return docFieldValue instanceof Array;\n case 'object':\n return ({}).toString.call(docFieldValue) === '[object Object]';\n }\n}\n\nvar matchers = {\n\n '$elemMatch': function (doc, userValue, parsedField, docFieldValue) {\n if (!Array.isArray(docFieldValue)) {\n return false;\n }\n\n if (docFieldValue.length === 0) {\n return false;\n }\n\n if (typeof docFieldValue[0] === 'object' && docFieldValue[0] !== null) {\n return docFieldValue.some(function (val) {\n return rowFilter(val, userValue, Object.keys(userValue));\n });\n }\n\n return docFieldValue.some(function (val) {\n return matchSelector(userValue, doc, parsedField, val);\n });\n },\n\n '$allMatch': function (doc, userValue, parsedField, docFieldValue) {\n if (!Array.isArray(docFieldValue)) {\n return false;\n }\n\n /* istanbul ignore next */\n if (docFieldValue.length === 0) {\n return false;\n }\n\n if (typeof docFieldValue[0] === 'object' && docFieldValue[0] !== null) {\n return docFieldValue.every(function (val) {\n return rowFilter(val, userValue, Object.keys(userValue));\n });\n }\n\n return docFieldValue.every(function (val) {\n return matchSelector(userValue, doc, parsedField, val);\n });\n },\n\n '$eq': function (doc, userValue, parsedField, docFieldValue) {\n return fieldIsNotUndefined(docFieldValue) && collate(docFieldValue, userValue) === 0;\n },\n\n '$gte': function (doc, userValue, parsedField, docFieldValue) {\n return fieldIsNotUndefined(docFieldValue) && collate(docFieldValue, userValue) >= 0;\n },\n\n '$gt': function (doc, userValue, parsedField, docFieldValue) {\n return fieldIsNotUndefined(docFieldValue) && collate(docFieldValue, userValue) > 0;\n },\n\n '$lte': function (doc, userValue, parsedField, docFieldValue) {\n return fieldIsNotUndefined(docFieldValue) && collate(docFieldValue, userValue) <= 0;\n },\n\n '$lt': function (doc, userValue, parsedField, docFieldValue) {\n return fieldIsNotUndefined(docFieldValue) && collate(docFieldValue, userValue) < 0;\n },\n\n '$exists': function (doc, userValue, parsedField, docFieldValue) {\n //a field that is null is still considered to exist\n if (userValue) {\n return fieldIsNotUndefined(docFieldValue);\n }\n\n return !fieldIsNotUndefined(docFieldValue);\n },\n\n '$mod': function (doc, userValue, parsedField, docFieldValue) {\n return fieldExists(docFieldValue) && modField(docFieldValue, userValue);\n },\n\n '$ne': function (doc, userValue, parsedField, docFieldValue) {\n return userValue.every(function (neValue) {\n return collate(docFieldValue, neValue) !== 0;\n });\n },\n '$in': function (doc, userValue, parsedField, docFieldValue) {\n return fieldExists(docFieldValue) && arrayContainsValue(docFieldValue, userValue);\n },\n\n '$nin': function (doc, userValue, parsedField, docFieldValue) {\n return fieldExists(docFieldValue) && !arrayContainsValue(docFieldValue, userValue);\n },\n\n '$size': function (doc, userValue, parsedField, docFieldValue) {\n return fieldExists(docFieldValue) &&\n Array.isArray(docFieldValue) &&\n arraySize(docFieldValue, userValue);\n },\n\n '$all': function (doc, userValue, parsedField, docFieldValue) {\n return Array.isArray(docFieldValue) && arrayContainsAllValues(docFieldValue, userValue);\n },\n\n '$regex': function (doc, userValue, parsedField, docFieldValue) {\n return fieldExists(docFieldValue) &&\n typeof docFieldValue == \"string\" &&\n userValue.every(function (regexValue) {\n return regexMatch(docFieldValue, regexValue);\n });\n },\n\n '$type': function (doc, userValue, parsedField, docFieldValue) {\n return typeMatch(docFieldValue, userValue);\n }\n};\n\n// return true if the given doc matches the supplied selector\nfunction matchesSelector(doc, selector) {\n /* istanbul ignore if */\n if (typeof selector !== 'object') {\n // match the CouchDB error message\n throw new Error('Selector error: expected a JSON object');\n }\n\n selector = massageSelector(selector);\n var row = {\n doc\n };\n\n var rowsMatched = filterInMemoryFields([row], { selector }, Object.keys(selector));\n return rowsMatched && rowsMatched.length === 1;\n}\n\nexport { massageSelector, matchesSelector, filterInMemoryFields, createFieldSorter, rowFilter, isCombinationalField, getKey, getValue, getFieldFromDoc, setFieldInDoc, compare, parseField };\n","import { createError, generateErrorFromResponse } from 'pouchdb-errors';\nimport { Headers } from 'pouchdb-fetch';\nimport abstractMapReduce from 'pouchdb-abstract-mapreduce';\nimport { stringMd5 } from 'pouchdb-md5';\nimport { collate } from 'pouchdb-collate';\nimport { getFieldFromDoc, setFieldInDoc, parseField, matchesSelector, getKey, getValue, massageSelector, compare, filterInMemoryFields } from 'pouchdb-selector-core';\nimport { clone, upsert, isRemote } from 'pouchdb-utils';\n\nconst nativeFlat = (...args) => args.flat(Infinity);\n\nconst polyFlat = (...args) => {\n let res = [];\n for (const subArr of args) {\n if (Array.isArray(subArr)) {\n res = res.concat(polyFlat(...subArr));\n } else {\n res.push(subArr);\n }\n }\n return res;\n};\n\nconst flatten = typeof Array.prototype.flat === 'function'\n ? nativeFlat\n : polyFlat;\n\nfunction mergeObjects(arr) {\n const res = {};\n for (const element of arr) {\n Object.assign(res, element);\n }\n return res;\n}\n\n// Selects a list of fields defined in dot notation from one doc\n// and copies them to a new doc. Like underscore _.pick but supports nesting.\nfunction pick(obj, arr) {\n const res = {};\n for (const field of arr) {\n const parsedField = parseField(field);\n const value = getFieldFromDoc(obj, parsedField);\n if (typeof value !== 'undefined') {\n setFieldInDoc(res, parsedField, value);\n }\n }\n return res;\n}\n\n// e.g. ['a'], ['a', 'b'] is true, but ['b'], ['a', 'b'] is false\nfunction oneArrayIsSubArrayOfOther(left, right) {\n for (let i = 0, len = Math.min(left.length, right.length); i < len; i++) {\n if (left[i] !== right[i]) {\n return false;\n }\n }\n return true;\n}\n\n// e.g.['a', 'b', 'c'], ['a', 'b'] is false\nfunction oneArrayIsStrictSubArrayOfOther(left, right) {\n if (left.length > right.length) {\n return false;\n }\n\n return oneArrayIsSubArrayOfOther(left, right);\n}\n\n// same as above, but treat the left array as an unordered set\n// e.g. ['b', 'a'], ['a', 'b', 'c'] is true, but ['c'], ['a', 'b', 'c'] is false\nfunction oneSetIsSubArrayOfOther(left, right) {\n left = left.slice();\n for (const field of right) {\n if (!left.length) {\n break;\n }\n const leftIdx = left.indexOf(field);\n if (leftIdx === -1) {\n return false;\n } else {\n left.splice(leftIdx, 1);\n }\n }\n return true;\n}\n\nfunction arrayToObject(arr) {\n const res = {};\n for (const field of arr) {\n res[field] = true;\n }\n return res;\n}\n\nfunction max(arr, fun) {\n let max = null;\n let maxScore = -1;\n for (const element of arr) {\n const score = fun(element);\n if (score > maxScore) {\n maxScore = score;\n max = element;\n }\n }\n return max;\n}\n\nfunction arrayEquals(arr1, arr2) {\n if (arr1.length !== arr2.length) {\n return false;\n }\n for (let i = 0, len = arr1.length; i < len; i++) {\n if (arr1[i] !== arr2[i]) {\n return false;\n }\n }\n return true;\n}\n\nfunction uniq(arr) {\n return Array.from(new Set(arr));\n}\n\n/**\n * Callbackifyable wrapper for async functions\n *\n * @template T, Args\n * @param {(...args: Args) => Promise<T>} fun\n * @returns {<CBArgs = [...Args, (err: any, value: T) => void], InnerArgs extends Args | CBArgs>(...innerArgs: InnerArgs) => InnerArgs extends CBArgs ? void : Promise<T>}\n *\n * @example\n * const fn = resolveToCallback(async () => { return 42; })\n * // with callback:\n * fn((err, value) => { ... })\n * // with await:\n * const value = await fn()\n */\nfunction resolveToCallback(fun) {\n return function (...args) {\n const maybeCallback = args[args.length - 1];\n if (typeof maybeCallback === \"function\") {\n const fulfilled = maybeCallback.bind(null, null);\n const rejected = maybeCallback.bind(null);\n fun.apply(this, args.slice(0, -1)).then(fulfilled, rejected);\n } else {\n return fun.apply(this, args);\n }\n };\n}\n\n// we restructure the supplied JSON considerably, because the official\n// Mango API is very particular about a lot of this stuff, but we like\n// to be liberal with what we accept in order to prevent mental\n// breakdowns in our users\nfunction massageCreateIndexRequest(requestDef) {\n requestDef = clone(requestDef);\n\n if (!requestDef.index) {\n requestDef.index = {};\n }\n\n for (const key of ['type', 'name', 'ddoc']) {\n if (requestDef.index[key]) {\n requestDef[key] = requestDef.index[key];\n delete requestDef.index[key];\n }\n }\n\n if (requestDef.fields) {\n requestDef.index.fields = requestDef.fields;\n delete requestDef.fields;\n }\n\n if (!requestDef.type) {\n requestDef.type = 'json';\n }\n return requestDef;\n}\n\nfunction isNonNullObject(value) {\n return typeof value === 'object' && value !== null;\n}\n\n// throws if the user is using the wrong query field value type\nfunction checkFieldValueType(name, value, isHttp) {\n let message = '';\n let received = value;\n let addReceived = true;\n if (['$in', '$nin', '$or', '$and', '$mod', '$nor', '$all'].indexOf(name) !== -1) {\n if (!Array.isArray(value)) {\n message = 'Query operator ' + name + ' must be an array.';\n\n }\n }\n\n if (['$not', '$elemMatch', '$allMatch'].indexOf(name) !== -1) {\n if (!(!Array.isArray(value) && isNonNullObject(value))) {\n message = 'Query operator ' + name + ' must be an object.';\n }\n }\n\n if (name === '$mod' && Array.isArray(value)) {\n if (value.length !== 2) {\n message = 'Query operator $mod must be in the format [divisor, remainder], ' +\n 'where divisor and remainder are both integers.';\n } else {\n const divisor = value[0];\n const mod = value[1];\n if (divisor === 0) {\n message = 'Query operator $mod\\'s divisor cannot be 0, cannot divide by zero.';\n addReceived = false;\n }\n if (typeof divisor !== 'number' || parseInt(divisor, 10) !== divisor) {\n message = 'Query operator $mod\\'s divisor is not an integer.';\n received = divisor;\n }\n if (parseInt(mod, 10) !== mod) {\n message = 'Query operator $mod\\'s remainder is not an integer.';\n received = mod;\n }\n }\n }\n if (name === '$exists') {\n if (typeof value !== 'boolean') {\n message = 'Query operator $exists must be a boolean.';\n }\n }\n\n if (name === '$type') {\n const allowed = ['null', 'boolean', 'number', 'string', 'array', 'object'];\n const allowedStr = '\"' + allowed.slice(0, allowed.length - 1).join('\", \"') + '\", or \"' + allowed[allowed.length - 1] + '\"';\n if (typeof value !== 'string') {\n message = 'Query operator $type must be a string. Supported values: ' + allowedStr + '.';\n } else if (allowed.indexOf(value) == -1) {\n message = 'Query operator $type must be a string. Supported values: ' + allowedStr + '.';\n }\n }\n\n if (name === '$size') {\n if (parseInt(value, 10) !== value) {\n message = 'Query operator $size must be a integer.';\n }\n }\n\n if (name === '$regex') {\n if (typeof value !== 'string') {\n if (isHttp) {\n message = 'Query operator $regex must be a string.';\n } else if (!(value instanceof RegExp)) {\n message = 'Query operator $regex must be a string or an instance ' +\n 'of a javascript regular expression.';\n }\n }\n }\n\n if (message) {\n if (addReceived) {\n const type = received === null\n ? ' '\n : Array.isArray(received)\n ? ' array'\n : ' ' + typeof received;\n const receivedStr = isNonNullObject(received)\n ? JSON.stringify(received, null, '\\t')\n : received;\n\n message += ' Received' + type + ': ' + receivedStr;\n }\n throw new Error(message);\n }\n}\n\nconst requireValidation = ['$all', '$allMatch', '$and', '$elemMatch', '$exists', '$in', '$mod', '$nin', '$nor', '$not', '$or', '$regex', '$size', '$type'];\nconst arrayTypeComparisonOperators = ['$in', '$nin', '$mod', '$all'];\nconst equalityOperators = ['$eq', '$gt', '$gte', '$lt', '$lte'];\n\n// recursively walks down the a query selector validating any operators\nfunction validateSelector(input, isHttp) {\n if (Array.isArray(input)) {\n for (const entry of input) {\n if (isNonNullObject(entry)) {\n validateSelector(entry, isHttp);\n }\n }\n }\n else {\n for (const [key, value] of Object.entries(input)) {\n if (requireValidation.indexOf(key) !== -1) {\n checkFieldValueType(key, value, isHttp);\n }\n if (equalityOperators.indexOf(key) !== -1) {\n // skip, explicit comparison operators can be anything\n continue;\n }\n if (arrayTypeComparisonOperators.indexOf(key) !== -1) {\n // skip, their values are already valid\n continue;\n }\n if (isNonNullObject(value)) {\n validateSelector(value, isHttp);\n }\n }\n }\n}\n\nasync function dbFetch(db, path, opts) {\n if (opts.body) {\n opts.body = JSON.stringify(opts.body);\n opts.headers = new Headers({ 'Content-type': 'application/json' });\n }\n\n const response = await db.fetch(path, opts);\n const json = await response.json();\n if (!response.ok) {\n json.status = response.status;\n const pouchError = createError(json);\n throw generateErrorFromResponse(pouchError);\n }\n return json;\n}\n\nasync function createIndex(db, requestDef) {\n return await dbFetch(db, '_index', {\n method: 'POST',\n body: massageCreateIndexRequest(requestDef)\n });\n}\n\nasync function find(db, requestDef) {\n validateSelector(requestDef.selector, true);\n return await dbFetch(db, '_find', {\n method: 'POST',\n body: requestDef\n });\n}\n\nasync function explain(db, requestDef) {\n return await dbFetch(db, '_explain', {\n method: 'POST',\n body: requestDef\n });\n}\n\nasync function getIndexes(db) {\n return await dbFetch(db, '_index', {\n method: 'GET'\n });\n}\n\nasync function deleteIndex(db, indexDef) {\n const ddoc = indexDef.ddoc;\n const type = indexDef.type || 'json';\n const name = indexDef.name;\n\n if (!ddoc) {\n throw new Error('you must provide an index\\'s ddoc');\n }\n\n if (!name) {\n throw new Error('you must provide an index\\'s name');\n }\n\n const url = '_index/' + [ddoc, type, name].map(encodeURIComponent).join('/');\n\n return await dbFetch(db, url, { method: 'DELETE' });\n}\n\n//\n// One thing about these mappers:\n//\n// Per the advice of John-David Dalton (http://youtu.be/NthmeLEhDDM),\n// what you want to do in this case is optimize for the smallest possible\n// function, since that's the thing that gets run over and over again.\n//\n// This code would be a lot simpler if all the if/elses were inside\n// the function, but it would also be a lot less performant.\n//\n\nfunction getDeepValue(value, path) {\n for (const key of path) {\n value = value[key];\n if (value === undefined) {\n return undefined;\n }\n }\n return value;\n}\n\nfunction createDeepMultiMapper(fields, emit, selector) {\n return function (doc) {\n if (selector && !matchesSelector(doc, selector)) { return; }\n\n const toEmit = [];\n for (const field of fields) {\n const value = getDeepValue(doc, parseField(field));\n if (value === undefined) {\n return;\n }\n toEmit.push(value);\n }\n emit(toEmit);\n };\n}\n\nfunction createDeepSingleMapper(field, emit, selector) {\n const parsedField = parseField(field);\n return function (doc) {\n if (selector && !matchesSelector(doc, selector)) { return; }\n\n const value = getDeepValue(doc, parsedField);\n if (value !== undefined) {\n emit(value);\n }\n };\n}\n\nfunction createShallowSingleMapper(field, emit, selector) {\n return function (doc) {\n if (selector && !matchesSelector(doc, selector)) { return; }\n emit(doc[field]);\n };\n}\n\nfunction createShallowMultiMapper(fields, emit, selector) {\n return function (doc) {\n if (selector && !matchesSelector(doc, selector)) { return; }\n const toEmit = fields.map(field => doc[field]);\n emit(toEmit);\n };\n}\n\nfunction checkShallow(fields) {\n return fields.every((field) => field.indexOf('.') === -1);\n}\n\nfunction createMapper(fields, emit, selector) {\n const isShallow = checkShallow(fields);\n const isSingle = fields.length === 1;\n\n // notice we try to optimize for the most common case,\n // i.e. single shallow indexes\n if (isShallow) {\n if (isSingle) {\n return createShallowSingleMapper(fields[0], emit, selector);\n } else { // multi\n return createShallowMultiMapper(fields, emit, selector);\n }\n } else { // deep\n if (isSingle) {\n return createDeepSingleMapper(fields[0], emit, selector);\n } else { // multi\n return createDeepMultiMapper(fields, emit, selector);\n }\n }\n}\n\nfunction mapper(mapFunDef, emit) {\n // mapFunDef is a list of fields\n\n const fields = Object.keys(mapFunDef.fields);\n const partialSelector = mapFunDef.partial_filter_selector;\n\n return createMapper(fields, emit, partialSelector);\n}\n\n/* istanbul ignore next */\nfunction reducer(/*reduceFunDef*/) {\n throw new Error('reduce not supported');\n}\n\nfunction ddocValidator(ddoc, viewName) {\n const view = ddoc.views[viewName];\n // This doesn't actually need to be here apparently, but\n // I feel safer keeping it.\n /* istanbul ignore if */\n if (!view.map || !view.map.fields) {\n throw new Error('ddoc ' + ddoc._id + ' with view ' + viewName +\n ' doesn\\'t have map.fields defined. ' +\n 'maybe it wasn\\'t created by this plugin?');\n }\n}\n\nconst abstractMapper = abstractMapReduce(\n /* localDocName */ 'indexes',\n mapper,\n reducer,\n ddocValidator\n);\n\nfunction abstractMapper$1 (db) {\n if (db._customFindAbstractMapper) {\n return {\n // Calls the _customFindAbstractMapper, but with a third argument:\n // the standard findAbstractMapper query/viewCleanup.\n // This allows the indexeddb adapter to support partial_filter_selector.\n query: function addQueryFallback(signature, opts) {\n const fallback = abstractMapper.query.bind(this);\n return db._customFindAbstractMapper.query.call(this, signature, opts, fallback);\n },\n viewCleanup: function addViewCleanupFallback() {\n const fallback = abstractMapper.viewCleanup.bind(this);\n return db._customFindAbstractMapper.viewCleanup.call(this, fallback);\n }\n };\n }\n return abstractMapper;\n}\n\n// normalize the \"sort\" value\nfunction massageSort(sort) {\n if (!Array.isArray(sort)) {\n throw new Error('invalid sort json - should be an array');\n }\n return sort.map(function (sorting) {\n if (typeof sorting === 'string') {\n const obj = {};\n obj[sorting] = 'asc';\n return obj;\n } else {\n return sorting;\n }\n });\n}\n\nconst ddocIdPrefix = /^_design\\//;\nfunction massageUseIndex(useIndex) {\n let cleanedUseIndex = [];\n if (typeof useIndex === 'string') {\n cleanedUseIndex.push(useIndex);\n } else {\n cleanedUseIndex = useIndex;\n }\n\n return cleanedUseIndex.map(function (name) {\n return name.replace(ddocIdPrefix, '');\n });\n}\n\nfunction massageIndexDef(indexDef) {\n indexDef.fields = indexDef.fields.map(function (field) {\n if (typeof field === 'string') {\n const obj = {};\n obj[field] = 'asc';\n return obj;\n }\n return field;\n });\n if (indexDef.partial_filter_selector) {\n indexDef.partial_filter_selector = massageSelector(\n indexDef.partial_filter_selector\n );\n }\n return indexDef;\n}\n\nfunction getKeyFromDoc(doc, index) {\n return index.def.fields.map((obj) => {\n const field = getKey(obj);\n return getFieldFromDoc(doc, parseField(field));\n });\n}\n\n// have to do this manually because REASONS. I don't know why\n// CouchDB didn't implement inclusive_start\nfunction filterInclusiveStart(rows, targetValue, index) {\n const indexFields = index.def.fields;\n let startAt = 0;\n for (const row of rows) {\n // shave off any docs at the beginning that are <= the\n // target value\n\n let docKey = getKeyFromDoc(row.doc, index);\n if (indexFields.length === 1) {\n docKey = docKey[0]; // only one field, not multi-field\n } else { // more than one field in index\n // in the case where e.g. the user is searching {$gt: {a: 1}}\n // but the index is [a, b], then we need to shorten the doc key\n while (docKey.length > targetValue.length) {\n docKey.pop();\n }\n }\n //ABS as we just looking for values that don't match\n if (Math.abs(collate(docKey, targetValue)) > 0) {\n // no need to filter any further; we're past the key\n break;\n }\n ++startAt;\n }\n return startAt > 0 ? rows.slice(startAt) : rows;\n}\n\nfunction reverseOptions(opts) {\n const newOpts = clone(opts);\n delete newOpts.startkey;\n delete newOpts.endkey;\n delete newOpts.inclusive_start;\n delete newOpts.inclusive_end;\n\n if ('endkey' in opts) {\n newOpts.startkey = opts.endkey;\n }\n if ('startkey' in opts) {\n newOpts.endkey = opts.startkey;\n }\n if ('inclusive_start' in opts) {\n newOpts.inclusive_end = opts.inclusive_start;\n }\n if ('inclusive_end' in opts) {\n newOpts.inclusive_start = opts.inclusive_end;\n }\n return newOpts;\n}\n\nfunction validateIndex(index) {\n const ascFields = index.fields.filter(function (field) {\n return getValue(field) === 'asc';\n });\n if (ascFields.length !== 0 && ascFields.length !== index.fields.length) {\n throw new Error('unsupported mixed sorting');\n }\n}\n\nfunction validateSort(requestDef, index) {\n if (index.defaultUsed && requestDef.sort) {\n const noneIdSorts = requestDef.sort.filter(function (sortItem) {\n return Object.keys(sortItem)[0] !== '_id';\n }).map(function (sortItem) {\n return Object.keys(sortItem)[0];\n });\n\n if (noneIdSorts.length > 0) {\n throw new Error('Cannot sort on field(s) \"' + noneIdSorts.join(',') +\n '\" when using the default index');\n }\n }\n\n if (index.defaultUsed) {\n return;\n }\n}\n\nfunction validateFindRequest(requestDef) {\n if (typeof requestDef.selector !== 'object') {\n throw new Error('you must provide a selector when you find()');\n }\n\n /*var selectors = requestDef.selector['$and'] || [requestDef.selector];\n for (var i = 0; i < selectors.length; i++) {\n var selector = selectors[i];\n var keys = Object.keys(selector);\n if (keys.length === 0) {\n throw new Error('invalid empty selector');\n }\n //var selection = selector[keys[0]];\n /*if (Object.keys(selection).length !== 1) {\n throw new Error('invalid selector: ' + JSON.stringify(selection) +\n ' - it must have exactly one key/value');\n }\n }*/\n}\n\n// determine the maximum number of fields\n// we're going to need to query, e.g. if the user\n// has selection ['a'] and sorting ['a', 'b'], then we\n// need to use the longer of the two: ['a', 'b']\nfunction getUserFields(selector, sort) {\n const selectorFields = Object.keys(selector);\n const sortFields = sort ? sort.map(getKey) : [];\n let userFields;\n if (selectorFields.length >= sortFields.length) {\n userFields = selectorFields;\n } else {\n userFields = sortFields;\n }\n\n if (sortFields.length === 0) {\n return {\n fields: userFields\n };\n }\n\n // sort according to the user's preferred sorting\n userFields = userFields.sort(function (left, right) {\n let leftIdx = sortFields.indexOf(left);\n if (leftIdx === -1) {\n leftIdx = Number.MAX_VALUE;\n }\n let rightIdx = sortFields.indexOf(right);\n if (rightIdx === -1) {\n rightIdx = Number.MAX_VALUE;\n }\n return leftIdx < rightIdx ? -1 : leftIdx > rightIdx ? 1 : 0;\n });\n\n return {\n fields: userFields,\n sortOrder: sort.map(getKey)\n };\n}\n\nasync function createIndex$1(db, requestDef) {\n requestDef = massageCreateIndexRequest(requestDef);\n const originalIndexDef = clone(requestDef.index);\n requestDef.index = massageIndexDef(requestDef.index);\n\n validateIndex(requestDef.index);\n\n // calculating md5 is expensive - memoize and only\n // run if required\n let md5;\n function getMd5() {\n return md5 || (md5 = stringMd5(JSON.stringify(requestDef)));\n }\n\n const viewName = requestDef.name || ('idx-' + getMd5());\n\n const ddocName = requestDef.ddoc || ('idx-' + getMd5());\n const ddocId = '_design/' + ddocName;\n\n let hasInvalidLanguage = false;\n let viewExists = false;\n\n function updateDdoc(doc) {\n if (doc._rev && doc.language !== 'query') {\n hasInvalidLanguage = true;\n }\n doc.language = 'query';\n doc.views = doc.views || {};\n\n viewExists = !!doc.views[viewName];\n\n if (viewExists) {\n return false;\n }\n\n doc.views[viewName] = {\n map: {\n fields: mergeObjects(requestDef.index.fields),\n partial_filter_selector: requestDef.index.partial_filter_selector\n },\n reduce: '_count',\n options: {\n def: originalIndexDef\n }\n };\n\n return doc;\n }\n\n db.constructor.emit('debug', ['find', 'creating index', ddocId]);\n\n await upsert(db, ddocId, updateDdoc);\n\n if (hasInvalidLanguage) {\n throw new Error('invalid language for ddoc with id \"' +\n ddocId +\n '\" (should be \"query\")');\n }\n\n // kick off a build\n // TODO: abstract-pouchdb-mapreduce should support auto-updating\n // TODO: should also use update_after, but pouchdb/pouchdb#3415 blocks me\n const signature = ddocName + '/' + viewName;\n await abstractMapper$1(db).query.call(db, signature, {\n limit: 0,\n reduce: false\n });\n return {\n id: ddocId,\n name: viewName,\n result: viewExists ? 'exists' : 'created'\n };\n}\n\nasync function getIndexes$1(db) {\n // just search through all the design docs and filter in-memory.\n // hopefully there aren't that many ddocs.\n const allDocsRes = await db.allDocs({\n startkey: '_design/',\n endkey: '_design/\\uffff',\n include_docs: true\n });\n const res = {\n indexes: [{\n ddoc: null,\n name: '_all_docs',\n type: 'special',\n def: {\n fields: [{ _id: 'asc' }]\n }\n }]\n };\n\n res.indexes = flatten(res.indexes, allDocsRes.rows.filter(function (row) {\n return row.doc.language === 'query';\n }).map(function (row) {\n const viewNames = row.doc.views !== undefined ? Object.keys(row.doc.views) : [];\n\n return viewNames.map(function (viewName) {\n const view = row.doc.views[viewName];\n return {\n ddoc: row.id,\n name: viewName,\n type: 'json',\n def: massageIndexDef(view.options.def)\n };\n });\n }));\n\n // these are sorted by view name for some reason\n res.indexes.sort(function (left, right) {\n return compare(left.name, right.name);\n });\n res.total_rows = res.indexes.length;\n return res;\n}\n\n// couchdb lowest collation value\nconst COLLATE_LO = null;\n\n// couchdb highest collation value (TODO: well not really, but close enough amirite)\nconst COLLATE_HI = { \"\\uffff\": {} };\n\nconst SHORT_CIRCUIT_QUERY = {\n queryOpts: { limit: 0, startkey: COLLATE_HI, endkey: COLLATE_LO },\n inMemoryFields: [],\n};\n\n// couchdb second-lowest collation value\n\nfunction checkFieldInIndex(index, field) {\n return index.def.fields\n .some((key) => getKey(key) === field);\n}\n\n// so when you do e.g. $eq/$eq, we can do it entirely in the database.\n// but when you do e.g. $gt/$eq, the first part can be done\n// in the database, but the second part has to be done in-memory,\n// because $gt has forced us to lose precision.\n// so that's what this determines\nfunction userOperatorLosesPrecision(selector, field) {\n const matcher = selector[field];\n const userOperator = getKey(matcher);\n\n return userOperator !== '$eq';\n}\n\n// sort the user fields by their position in the index,\n// if they're in the index\nfunction sortFieldsByIndex(userFields, index) {\n const indexFields = index.def.fields.map(getKey);\n\n return userFields.slice().sort(function (a, b) {\n let aIdx = indexFields.indexOf(a);\n let bIdx = indexFields.indexOf(b);\n if (aIdx === -1) {\n aIdx = Number.MAX_VALUE;\n }\n if (bIdx === -1) {\n bIdx = Number.MAX_VALUE;\n }\n return compare(aIdx, bIdx);\n });\n}\n\n// first pass to try to find fields that will need to be sorted in-memory\nfunction getBasicInMemoryFields(index, selector, userFields) {\n userFields = sortFieldsByIndex(userFields, index);\n\n // check if any of the user selectors lose precision\n let needToFilterInMemory = false;\n for (let i = 0, len = userFields.length; i < len; i++) {\n const field = userFields[i];\n if (needToFilterInMemory || !checkFieldInIndex(index, field)) {\n return userFields.slice(i);\n }\n if (i < len - 1 && userOperatorLosesPrecision(selector, field)) {\n needToFilterInMemory = true;\n }\n }\n return [];\n}\n\nfunction getInMemoryFieldsFromNe(selector) {\n const fields = [];\n for (const [field, matcher] of Object.entries(selector)) {\n for (const operator of Object.keys(matcher)) {\n if (operator === '$ne') {\n fields.push(field);\n }\n }\n }\n return fields;\n}\n\nfunction getInMemoryFields(coreInMemoryFields, index, selector, userFields) {\n const result = flatten(\n // in-memory fields reported as necessary by the query planner\n coreInMemoryFields,\n // combine with another pass that checks for any we may have missed\n getBasicInMemoryFields(index, selector, userFields),\n // combine with another pass that checks for $ne's\n getInMemoryFieldsFromNe(selector)\n );\n\n return sortFieldsByIndex(uniq(result), index);\n}\n\n// check that at least one field in the user's query is represented\n// in the index. order matters in the case of sorts\nfunction checkIndexFieldsMatch(indexFields, sortOrder, fields) {\n if (sortOrder) {\n // array has to be a strict subarray of index array. furthermore,\n // the sortOrder fields need to all be represented in the index\n const sortMatches = oneArrayIsStrictSubArrayOfOther(sortOrder, indexFields);\n const selectorMatches = oneArrayIsSubArrayOfOther(fields, indexFields);\n\n return sortMatches && selectorMatches;\n }\n\n // all of the user's specified fields still need to be\n // on the left side of the index array, although the order\n // doesn't matter\n return oneSetIsSubArrayOfOther(fields, indexFields);\n}\n\nconst logicalMatchers = ['$eq', '$gt', '$gte', '$lt', '$lte'];\nfunction isNonLogicalMatcher(matcher) {\n return logicalMatchers.indexOf(matcher) === -1;\n}\n\n// check all the index fields for usages of '$ne'\n// e.g. if the user queries {foo: {$ne: 'foo'}, bar: {$eq: 'bar'}},\n// then we can neither use an index on ['foo'] nor an index on\n// ['foo', 'bar'], but we can use an index on ['bar'] or ['bar', 'foo']\nfunction checkFieldsLogicallySound(indexFields, selector) {\n const firstField = indexFields[0];\n const matcher = selector[firstField];\n\n if (typeof matcher === 'undefined') {\n /* istanbul ignore next */\n return true;\n }\n\n const isInvalidNe = Object.keys(matcher).length === 1 &&\n getKey(matcher) === '$ne';\n\n return !isInvalidNe;\n}\n\nfunction checkIndexMatches(index, sortOrder, fields, selector) {\n const indexFields = index.def.fields.map(getKey);\n const fieldsMatch = checkIndexFieldsMatch(indexFields, sortOrder, fields);\n\n if (!fieldsMatch) {\n return false;\n }\n\n return checkFieldsLogicallySound(indexFields, selector);\n}\n\n//\n// the algorithm is very simple:\n// take all the fields the user supplies, and if those fields\n// are a strict subset of the fields in some index,\n// then use that index\n//\nfunction findMatchingIndexes(selector, userFields, sortOrder, indexes) {\n return indexes.filter(function (index) {\n return checkIndexMatches(index, sortOrder, userFields, selector);\n });\n}\n\n// find the best index, i.e. the one that matches the most fields\n// in the user's query\nfunction findBestMatchingIndex(selector, userFields, sortOrder, indexes, useIndex) {\n const matchingIndexes = findMatchingIndexes(selector, userFields, sortOrder, indexes);\n\n if (matchingIndexes.length === 0) {\n if (useIndex) {\n throw {\n error: \"no_usable_index\",\n message: \"There is no index available for this selector.\"\n };\n }\n // return `all_docs` as a default index;\n // I'm assuming that _all_docs is always first\n const defaultIndex = indexes[0];\n defaultIndex.defaultUsed = true;\n return defaultIndex;\n }\n if (matchingIndexes.length === 1 && !useIndex) {\n return matchingIndexes[0];\n }\n\n const userFieldsMap = arrayToObject(userFields);\n\n function scoreIndex(index) {\n const indexFields = index.def.fields.map(getKey);\n let score = 0;\n for (const indexField of indexFields) {\n if (userFieldsMap[indexField]) {\n score++;\n }\n }\n return score;\n }\n\n if (useIndex) {\n const useIndexDdoc = '_design/' + useIndex[0];\n const useIndexName = useIndex.length === 2 ? useIndex[1] : false;\n const index = matchingIndexes.find(function (index) {\n if (useIndexName && index.ddoc === useIndexDdoc && useIndexName === index.name) {\n return true;\n }\n\n if (index.ddoc === useIndexDdoc) {\n /* istanbul ignore next */\n return true;\n }\n\n return false;\n });\n\n if (!index) {\n throw {\n error: \"unknown_error\",\n message: \"Could not find that index or could not use that index for the query\"\n };\n }\n return index;\n }\n\n return max(matchingIndexes, scoreIndex);\n}\n\nfunction getSingleFieldQueryOptsFor(userOperator, userValue) {\n switch (userOperator) {\n case '$eq':\n return { key: userValue };\n case '$lte':\n return { endkey: userValue };\n case '$gte':\n return { startkey: userValue };\n case '$lt':\n return {\n endkey: userValue,\n inclusive_end: false\n };\n case '$gt':\n return {\n startkey: userValue,\n inclusive_start: false\n };\n }\n\n return {\n startkey: COLLATE_LO\n };\n}\n\nfunction getSingleFieldCoreQueryPlan(selector, index) {\n const field = getKey(index.def.fields[0]);\n //ignoring this because the test to exercise the branch is skipped at the moment\n /* istanbul ignore next */\n const matcher = selector[field] || {};\n const inMemoryFields = [];\n const userOperators = Object.keys(matcher);\n\n let combinedOpts;\n\n for (const userOperator of userOperators) {\n if (isNonLogicalMatcher(userOperator)) {\n inMemoryFields.push(field);\n }\n\n const userValue = matcher[userOperator];\n const newQueryOpts = getSingleFieldQueryOptsFor(userOperator, userValue);\n\n if (combinedOpts) {\n combinedOpts = mergeObjects([combinedOpts, newQueryOpts]);\n } else {\n combinedOpts = newQueryOpts;\n }\n }\n\n return {\n queryOpts: combinedOpts,\n inMemoryFields\n };\n}\n\nfunction getMultiFieldCoreQueryPlan(userOperator, userValue) {\n switch (userOperator) {\n case '$eq':\n return {\n startkey: userValue,\n endkey: userValue\n };\n case '$lte':\n return {\n endkey: userValue\n };\n case '$gte':\n return {\n startkey: userValue\n };\n case '$lt':\n return {\n endkey: userValue,\n inclusive_end: false\n };\n case '$gt':\n return {\n startkey: userValue,\n inclusive_start: false\n };\n }\n}\n\nfunction getMultiFieldQueryOpts(selector, index) {\n const indexFields = index.def.fields.map(getKey);\n\n let inMemoryFields = [];\n const startkey = [];\n const endkey = [];\n let inclusiveStart;\n let inclusiveEnd;\n\n function finish(i) {\n\n if (inclusiveStart !== false) {\n startkey.push(COLLATE_LO);\n }\n if (inclusiveEnd !== false) {\n endkey.push(COLLATE_HI);\n }\n // keep track of the fields where we lost specificity,\n // and therefore need to filter in-memory\n inMemoryFields = indexFields.slice(i);\n }\n\n for (let i = 0, len = indexFields.length; i < len; i++) {\n const indexField = indexFields[i];\n const matcher = selector[indexField];\n\n if (!matcher || !Object.keys(matcher).length) { // fewer fields in user query than in index\n finish(i);\n break;\n } else if (Object.keys(matcher).some(isNonLogicalMatcher)) { // non-logical are ignored\n finish(i);\n break;\n } else if (i > 0) {\n const usingGtlt = (\n '$gt' in matcher || '$gte' in matcher ||\n '$lt' in matcher || '$lte' in matcher);\n const previousKeys = Object.keys(selector[indexFields[i - 1]]);\n const previousWasEq = arrayEquals(previousKeys, ['$eq']);\n const previousWasSame = arrayEquals(previousKeys, Object.keys(matcher));\n const gtltLostSpecificity = usingGtlt && !previousWasEq && !previousWasSame;\n if (gtltLostSpecificity) {\n finish(i);\n break;\n }\n }\n\n const userOperators = Object.keys(matcher);\n let combinedOpts = null;\n\n for (const userOperator of userOperators) {\n const userValue = matcher[userOperator];\n const newOpts = getMultiFieldCoreQueryPlan(userOperator, userValue);\n\n if (combinedOpts) {\n combinedOpts = mergeObjects([combinedOpts, newOpts]);\n } else {\n combinedOpts = newOpts;\n }\n }\n\n startkey.push('startkey' in combinedOpts ? combinedOpts.startkey : COLLATE_LO);\n endkey.push('endkey' in combinedOpts ? combinedOpts.endkey : COLLATE_HI);\n if ('inclusive_start' in combinedOpts) {\n inclusiveStart = combinedOpts.inclusive_start;\n }\n if ('inclusive_end' in combinedOpts) {\n inclusiveEnd = combinedOpts.inclusive_end;\n }\n }\n\n const res = {\n startkey,\n endkey\n };\n\n if (typeof inclusiveStart !== 'undefined') {\n res.inclusive_start = inclusiveStart;\n }\n if (typeof inclusiveEnd !== 'undefined') {\n res.inclusive_end = inclusiveEnd;\n }\n\n return {\n queryOpts: res,\n inMemoryFields\n };\n}\n\nfunction shouldShortCircuit(selector) {\n // We have a field to select from, but not a valid value\n // this should result in a short circuited query\n // just like the http adapter (couchdb) and mongodb\n // see tests for issue #7810\n\n // @todo Use 'Object.values' when Node.js v6 support is dropped.\n const values = Object.keys(selector).map(function (key) {\n return selector[key];\n });\n return values.some(function (val) {\n return typeof val === 'object' && Object.keys(val).length === 0;\n });\n}\n\nfunction getDefaultQueryPlan(selector) {\n //using default index, so all fields need to be done in memory\n return {\n queryOpts: { startkey: null },\n inMemoryFields: [Object.keys(selector)]\n };\n}\n\nfunction getCoreQueryPlan(selector, index) {\n if (index.defaultUsed) {\n return getDefaultQueryPlan(selector, index);\n }\n\n if (index.def.fields.length === 1) {\n // one field in index, so the value was indexed as a singleton\n return getSingleFieldCoreQueryPlan(selector, index);\n }\n // else index has multiple fields, so the value was indexed as an array\n return getMultiFieldQueryOpts(selector, index);\n}\n\nfunction planQuery(request, indexes) {\n const selector = request.selector;\n const sort = request.sort;\n\n if (shouldShortCircuit(selector)) {\n return Object.assign({}, SHORT_CIRCUIT_QUERY, { index: indexes[0] });\n }\n\n const userFieldsRes = getUserFields(selector, sort);\n\n const userFields = userFieldsRes.fields;\n const sortOrder = userFieldsRes.sortOrder;\n const index = findBestMatchingIndex(selector, userFields, sortOrder, indexes, request.use_index);\n\n const coreQueryPlan = getCoreQueryPlan(selector, index);\n const queryOpts = coreQueryPlan.queryOpts;\n const coreInMemoryFields = coreQueryPlan.inMemoryFields;\n\n const inMemoryFields = getInMemoryFields(coreInMemoryFields, index, selector, userFields);\n\n return {\n queryOpts,\n index,\n inMemoryFields\n };\n}\n\nfunction indexToSignature(index) {\n // remove '_design/'\n return index.ddoc.substring(8) + '/' + index.name;\n}\n\nasync function doAllDocs(db, originalOpts) {\n const opts = clone(originalOpts);\n\n // CouchDB responds in weird ways when you provide a non-string to _id;\n // we mimic the behavior for consistency. See issue66 tests for details.\n if (opts.descending) {\n if ('endkey' in opts && typeof opts.endkey !== 'string') {\n opts.endkey = '';\n }\n if ('startkey' in opts && typeof opts.startkey !== 'string') {\n opts.limit = 0;\n }\n } else {\n if ('startkey' in opts && typeof opts.startkey !== 'string') {\n opts.startkey = '';\n }\n if ('endkey' in opts && typeof opts.endkey !== 'string') {\n opts.limit = 0;\n }\n }\n if ('key' in opts && typeof opts.key !== 'string') {\n opts.limit = 0;\n }\n\n if (opts.limit > 0 && opts.indexes_count) {\n // brute force and quite naive impl.\n // amp up the limit with the amount of (indexes) design docs\n // or is this too naive? How about skip?\n opts.original_limit = opts.limit;\n opts.limit += opts.indexes_count;\n }\n\n const res = await db.allDocs(opts);\n // filter out any design docs that _all_docs might return\n res.rows = res.rows.filter(function (row) {\n return !/^_design\\//.test(row.id);\n });\n // put back original limit\n if (opts.original_limit) {\n opts.limit = opts.original_limit;\n }\n // enforce the rows to respect the given limit\n res.rows = res.rows.slice(0, opts.limit);\n return res;\n}\n\nasync function queryAllOrIndex(db, opts, indexToUse) {\n if (indexToUse.name === '_all_docs') {\n return doAllDocs(db, opts);\n }\n return abstractMapper$1(db).query.call(db, indexToSignature(indexToUse), opts);\n}\n\nasync function find$1(db, requestDef, explain) {\n if (requestDef.selector) {\n // must be validated before massaging\n validateSelector(requestDef.selector, false);\n requestDef.selector = massageSelector(requestDef.selector);\n }\n\n if (requestDef.sort) {\n requestDef.sort = massageSort(requestDef.sort);\n }\n\n if (requestDef.use_index) {\n requestDef.use_index = massageUseIndex(requestDef.use_index);\n }\n\n if (!('limit' in requestDef)) {\n // Match the default limit of CouchDB\n requestDef.limit = 25;\n }\n\n validateFindRequest(requestDef);\n\n const getIndexesRes = await getIndexes$1(db);\n\n db.constructor.emit('debug', ['find', 'planning query', requestDef]);\n const queryPlan = planQuery(requestDef, getIndexesRes.indexes);\n db.constructor.emit('debug', ['find', 'query plan', queryPlan]);\n\n const indexToUse = queryPlan.index;\n\n validateSort(requestDef, indexToUse);\n\n let opts = Object.assign({\n include_docs: true,\n reduce: false,\n // Add amount of index for doAllDocs to use (related to issue #7810)\n indexes_count: getIndexesRes.total_rows,\n }, queryPlan.queryOpts);\n\n if ('startkey' in opts && 'endkey' in opts &&\n collate(opts.startkey, opts.endkey) > 0) {\n // can't possibly return any results, startkey > endkey\n /* istanbul ignore next */\n return { docs: [] };\n }\n\n const isDescending = requestDef.sort &&\n typeof requestDef.sort[0] !== 'string' &&\n getValue(requestDef.sort[0]) === 'desc';\n\n if (isDescending) {\n // either all descending or all ascending\n opts.descending = true;\n opts = reverseOptions(opts);\n }\n\n if (!queryPlan.inMemoryFields.length) {\n // no in-memory filtering necessary, so we can let the\n // database do the limit/skip for us\n opts.limit = requestDef.limit;\n if ('skip' in requestDef) {\n opts.skip = requestDef.skip;\n }\n }\n\n if (explain) {\n return Promise.resolve(queryPlan, opts);\n }\n\n const res = await queryAllOrIndex(db, opts, indexToUse);\n\n\n if (opts.inclusive_start === false) {\n // may have to manually filter the first one,\n // since couchdb has no true inclusive_start option\n res.rows = filterInclusiveStart(res.rows, opts.startkey, indexToUse);\n }\n\n if (queryPlan.inMemoryFields.length) {\n // need to filter some stuff in-memory\n res.rows = filterInMemoryFields(res.rows, requestDef, queryPlan.inMemoryFields);\n }\n\n const resp = {\n docs: res.rows.map(function (row) {\n const doc = row.doc;\n if (requestDef.fields) {\n return pick(doc, requestDef.fields);\n }\n return doc;\n })\n };\n\n if (indexToUse.defaultUsed) {\n resp.warning = 'No matching index found, create an index to optimize query time.';\n }\n\n return resp;\n}\n\nasync function explain$1(db, requestDef) {\n const queryPlan = await find$1(db, requestDef, true);\n\n return {\n dbname: db.name,\n index: queryPlan.index,\n selector: requestDef.selector,\n range: {\n start_key: queryPlan.queryOpts.startkey,\n end_key: queryPlan.queryOpts.endkey,\n },\n opts: {\n use_index: requestDef.use_index || [],\n bookmark: \"nil\", //hardcoded to match CouchDB since its not supported,\n limit: requestDef.limit,\n skip: requestDef.skip,\n sort: requestDef.sort || {},\n fields: requestDef.fields,\n conflicts: false, //hardcoded to match CouchDB since its not supported,\n r: [49], // hardcoded to match CouchDB since its not support\n },\n limit: requestDef.limit,\n skip: requestDef.skip || 0,\n fields: requestDef.fields,\n };\n}\n\nasync function deleteIndex$1(db, index) {\n\n if (!index.ddoc) {\n throw new Error('you must supply an index.ddoc when deleting');\n }\n\n if (!index.name) {\n throw new Error('you must supply an index.name when deleting');\n }\n\n const docId = index.ddoc;\n const viewName = index.name;\n\n function deltaFun(doc) {\n if (Object.keys(doc.views).length === 1 && doc.views[viewName]) {\n // only one view in this ddoc, delete the whole ddoc\n return {_id: docId, _deleted: true};\n }\n // more than one view here, just remove the view\n delete doc.views[viewName];\n return doc;\n }\n\n await upsert(db, docId, deltaFun);\n await abstractMapper$1(db).viewCleanup.apply(db);\n return { ok: true };\n}\n\nconst plugin = {};\nplugin.createIndex = resolveToCallback(async function (requestDef) {\n if (typeof requestDef !== 'object') {\n throw new Error('you must provide an index to create');\n }\n\n const createIndex$$1 = isRemote(this) ?\n createIndex : createIndex$1;\n return createIndex$$1(this, requestDef);\n});\n\nplugin.find = resolveToCallback(async function (requestDef) {\n if (typeof requestDef !== 'object') {\n throw new Error('you must provide search parameters to find()');\n }\n\n const find$$1 = isRemote(this) ? find : find$1;\n return find$$1(this, requestDef);\n});\n\nplugin.explain = resolveToCallback(async function (requestDef) {\n if (typeof requestDef !== 'object') {\n throw new Error('you must provide search parameters to explain()');\n }\n\n const find$$1 = isRemote(this) ? explain : explain$1;\n return find$$1(this, requestDef);\n});\n\nplugin.getIndexes = resolveToCallback(async function () {\n const getIndexes$$1 = isRemote(this) ? getIndexes : getIndexes$1;\n return getIndexes$$1(this);\n});\n\nplugin.deleteIndex = resolveToCallback(async function (indexDef) {\n if (typeof indexDef !== 'object') {\n throw new Error('you must provide an index to delete');\n }\n\n const deleteIndex$$1 = isRemote(this) ?\n deleteIndex : deleteIndex$1;\n return deleteIndex$$1(this, indexDef);\n});\n\nexport default plugin;\n","import { Headers } from 'pouchdb-fetch';\nimport { clone } from 'pouchdb-utils';\n\nfunction getConfigUrl(nodeName) {\n return (nodeName ? '/_node/' + nodeName : '') + '/_config';\n}\n\nfunction wrapError(err) {\n if (err.name === 'unknown_error') {\n err.message = (err.message || '') +\n ' Unknown error! Did you remember to enable CORS?';\n }\n throw err;\n}\n\n// Wrapper around the fetch API to send and receive JSON objects\n// Similar to fetchJSON in pouchdb-adapter-http, but both functions are private.\n// Consider extracting them to a common library.\nfunction fetchJSON(dbFetch, path, options) {\n options = options || {};\n\n if (options.body) {\n options.body = JSON.stringify(options.body);\n }\n\n options.headers = options.headers || new Headers();\n options.headers.set('Content-Type', 'application/json');\n options.headers.set('Accept', 'application/json');\n\n return dbFetch(path, options).then(function (response) {\n if (response.ok) {\n return response.json();\n } else {\n return response.json().then(function (responseError) {\n throw responseError;\n });\n }\n }).catch(wrapError);\n}\n\n// toCallback takes a function that returns a promise,\n// and returns a function that can be used with a callback as the last argument,\n// but still retains the ability to be used without a callback and return a promise.\n// (Roughly speaking, the opposite of `toPromise` from pouchdb-utils,\n// but more suited for `fetch`, that returns a promise by default.)\nfunction toCallback(func) {\n return function () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n if (typeof args[-1] === 'function') {\n var callback = args[-1];\n return func.apply(this, args.slice(0, -2)).then(\n function (res) { return callback(null, res); },\n function (err) { return callback(err); }\n );\n } else {\n return func.apply(this, args);\n }\n };\n}\n\nvar AuthError = /*@__PURE__*/(function (Error) {\n function AuthError(message) {\n Error.call(this, message);\n this.name = 'authentication_error';\n this.status = 400;\n this.error = true;\n\n // This is needed because extending built-in classes like Error\n // can have issues with the prototype chain in TypeScript/JavaScript\n Object.setPrototypeOf(this, AuthError.prototype);\n }\n\n if ( Error ) AuthError.__proto__ = Error;\n AuthError.prototype = Object.create( Error && Error.prototype );\n AuthError.prototype.constructor = AuthError;\n\n return AuthError;\n}(Error));\n\nvar getMembership = toCallback(function (opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n\n var path = '/_membership';\n var ajaxOpts = Object.assign({\n method: 'GET',\n }, opts.ajax || {});\n return fetchJSON(db.fetch, path, ajaxOpts);\n});\n\nvar getNodeName = function (db, opts) {\n return db.getMembership(opts).then(\n function (membership) {\n // Some couchdb-2.x-like server\n return membership.all_nodes[0];\n },\n function (error) {\n if (error.error !== 'illegal_database_name') {\n throw error;\n } else {\n // Some couchdb-1.x-like server\n return undefined;\n }\n }\n );\n};\n\nvar signUpAdmin = toCallback(function (username, password, opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n if (['http', 'https'].indexOf(db.type()) === -1) {\n return Promise.reject(new AuthError('This plugin only works for the http/https adapter. ' +\n 'So you should use new PouchDB(\"http://mysite.com:5984/mydb\") instead.'));\n } else if (!username) {\n return Promise.reject(new AuthError('You must provide a username'));\n } else if (!password) {\n return Promise.reject(new AuthError('You must provide a password'));\n }\n\n return getNodeName(db, opts).then(function (nodeName) {\n var configUrl = getConfigUrl(nodeName);\n var url = (opts.configUrl || configUrl) + '/admins/' + encodeURIComponent(username);\n var ajaxOpts = Object.assign({\n method: 'PUT',\n body: password\n }, opts.ajax || {});\n return fetchJSON(db.fetch, url, ajaxOpts);\n });\n});\n\nvar deleteAdmin = toCallback(function (username, opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n if (['http', 'https'].indexOf(db.type()) === -1) {\n return Promise.reject(new AuthError('This plugin only works for the http/https adapter. ' +\n 'So you should use new PouchDB(\"http://mysite.com:5984/mydb\") instead.'));\n } else if (!username) {\n return Promise.reject(new AuthError('You must provide a username'));\n }\n\n return getNodeName(db, opts).then(function (nodeName) {\n var configUrl = getConfigUrl(nodeName);\n var url = (opts.configUrl || configUrl) + '/admins/' + encodeURIComponent(username);\n var ajaxOpts = Object.assign({\n method: 'DELETE',\n processData: false\n }, opts.ajax || {});\n return fetchJSON(db.fetch, url, ajaxOpts);\n });\n});\n\nvar sessionPath = '/_session';\n\nvar logIn = toCallback(function (username, password, opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n if (['http', 'https'].indexOf(db.type()) === -1) {\n return Promise.reject(new AuthError('this plugin only works for the http/https adapter'));\n }\n\n if (!username) {\n return Promise.reject(new AuthError('you must provide a username'));\n } else if (!password) {\n return Promise.reject(new AuthError('you must provide a password'));\n }\n\n var path = sessionPath;\n var ajaxOpts = Object.assign({\n method: 'POST',\n body: {name: username, password: password},\n }, opts.ajax || {});\n return fetchJSON(db.fetch, path, ajaxOpts);\n});\n\nvar logOut = toCallback(function (opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n\n var path = sessionPath;\n var ajaxOpts = Object.assign({\n method: 'DELETE'\n }, opts.ajax || {});\n return fetchJSON(db.fetch, path, ajaxOpts);\n});\n\nvar getSession = toCallback(function (opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n\n var path = sessionPath;\n var ajaxOpts = Object.assign({\n method: 'GET'\n }, opts.ajax || {});\n return fetchJSON(db.fetch, path, ajaxOpts);\n});\n\nvar usersPath = '/_users';\n\nfunction updateUser(db, user, opts) {\n var reservedWords = [\n '_id',\n '_rev',\n 'name',\n 'type',\n 'roles',\n 'password',\n 'password_scheme',\n 'iterations',\n 'derived_key',\n 'salt' ];\n\n if (opts.metadata) {\n for (var key in opts.metadata) {\n if (opts.metadata.hasOwnProperty(key) && reservedWords.indexOf(key) !== -1) {\n return Promise.reject(new AuthError('cannot use reserved word in metadata: \"' + key + '\"'));\n }\n }\n user = Object.assign(user, opts.metadata);\n }\n\n if (opts.roles) {\n user = Object.assign(user, {roles: opts.roles});\n }\n var path = usersPath + '/' + encodeURIComponent(user._id);\n var ajaxOpts = Object.assign({\n method: 'PUT',\n body: user\n }, opts.ajax || {});\n\n return fetchJSON(db.fetch, path, ajaxOpts);\n}\n\nvar signUp = toCallback(function (username, password, opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n if (['http', 'https'].indexOf(db.type()) === -1) {\n return Promise.reject(new AuthError('This plugin only works for the http/https adapter. ' +\n 'So you should use new PouchDB(\"http://mysite.com:5984/mydb\") instead.'));\n } else if (!username) {\n return Promise.reject(new AuthError('You must provide a username'));\n } else if (!password) {\n return Promise.reject(new AuthError('You must provide a password'));\n }\n\n var userId = 'org.couchdb.user:' + username;\n var user = {\n name: username,\n password: password,\n roles: [],\n type: 'user',\n _id: userId,\n };\n\n return updateUser(db, user, opts);\n});\n\nvar getUser = toCallback(function (username, opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n if (!username) {\n return Promise.reject(new AuthError('you must provide a username'));\n }\n\n var path = usersPath + '/' + encodeURIComponent('org.couchdb.user:' + username);\n var ajaxOpts = Object.assign({\n method: 'GET'\n }, opts.ajax || {});\n return fetchJSON(db.fetch, path, ajaxOpts).then(function (x) { console.log(x); return x;});\n});\n\nvar putUser = toCallback(function (username, opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n if (['http', 'https'].indexOf(db.type()) === -1) {\n return Promise.reject(new AuthError('This plugin only works for the http/https adapter. ' +\n 'So you should use new PouchDB(\"http://mysite.com:5984/mydb\") instead.'));\n } else if (!username) {\n return Promise.reject(new AuthError('You must provide a username'));\n }\n\n return db.getUser(username, opts).then(function (user) { return updateUser(db, user, opts); });\n});\n\nvar deleteUser = toCallback(function (username, opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n if (['http', 'https'].indexOf(db.type()) === -1) {\n return Promise.reject(new AuthError('This plugin only works for the http/https adapter. ' +\n 'So you should use new PouchDB(\"http://mysite.com:5984/mydb\") instead.'));\n } else if (!username) {\n return Promise.reject(new AuthError('You must provide a username'));\n }\n\n return db.getUser(username, opts).then(function (user) {\n var path = usersPath + '/' + encodeURIComponent(user._id) + '?rev=' + user._rev;\n var ajaxOpts = Object.assign({\n method: 'DELETE'\n }, opts.ajax || {});\n return fetchJSON(db.fetch, path, ajaxOpts);\n });\n});\n\nvar changePassword = toCallback(function (username, password, opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n if (['http', 'https'].indexOf(db.type()) === -1) {\n return Promise.reject(new AuthError('This plugin only works for the http/https adapter. ' +\n 'So you should use new PouchDB(\"http://mysite.com:5984/mydb\") instead.'));\n } else if (!username) {\n return Promise.reject(new AuthError('You must provide a username'));\n } else if (!password) {\n return Promise.reject(new AuthError('You must provide a password'));\n }\n return db.getUser(username, opts).then(function (user) {\n user.password = password;\n var path = usersPath + '/' + encodeURIComponent(user._id);\n var ajaxOpts = Object.assign({\n method: 'PUT',\n body: user,\n }, opts.ajax || {});\n\n return fetchJSON(db.fetch, path, ajaxOpts);\n });\n});\n\nvar changeUsername = toCallback(function (oldUsername, newUsername, opts) {\n var db = this;\n var USERNAME_PREFIX = 'org.couchdb.user:';\n var updateUser = function (user, opts) {\n var path = usersPath + '/' + encodeURIComponent(user._id);\n var updateOpts = Object.assign({\n method: 'PUT',\n body: user\n }, opts.ajax);\n return fetchJSON(db.fetch, path, updateOpts);\n };\n if (typeof opts === 'undefined') {\n opts = {};\n }\n opts.ajax = opts.ajax || {};\n if (['http', 'https'].indexOf(db.type()) === -1) {\n return Promise.reject(new AuthError('This plugin only works for the http/https adapter. ' +\n 'So you should use new PouchDB(\"http://mysite.com:5984/mydb\") instead.'));\n }\n if (!newUsername) {\n return Promise.reject(new AuthError('You must provide a new username'));\n }\n if (!oldUsername) {\n return Promise.reject(new AuthError('You must provide a username to rename'));\n }\n\n return db.getUser(newUsername, opts)\n .then(function () {\n var error = new AuthError('user already exists');\n error.taken = true;\n throw error;\n }, function () {\n return db.getUser(oldUsername, opts);\n })\n .then(function (user) {\n var newUser = clone(user);\n delete newUser._rev;\n newUser._id = USERNAME_PREFIX + newUsername;\n newUser.name = newUsername;\n newUser.roles = opts.roles || user.roles || {};\n return updateUser(newUser, opts).then(function () {\n user._deleted = true;\n return updateUser(user, opts);\n });\n });\n});\n\nvar plugin = {};\n\nplugin.login = logIn;\nplugin.logIn = logIn;\nplugin.logout = logOut;\nplugin.logOut = logOut;\nplugin.getSession = getSession;\n\nplugin.getMembership = getMembership;\nplugin.signUpAdmin = signUpAdmin;\nplugin.deleteAdmin = deleteAdmin;\n\nplugin.signup = signUp;\nplugin.signUp = signUp;\nplugin.getUser = getUser;\nplugin.putUser = putUser;\nplugin.deleteUser = deleteUser;\nplugin.changePassword = changePassword;\nplugin.changeUsername = changeUsername;\n\nif (typeof window !== 'undefined' && window.PouchDB) {\n window.PouchDB.plugin(plugin);\n}\n\nexport default plugin;\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n if (!getRandomValues) {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n getRandomValues = crypto.getRandomValues.bind(crypto);\n }\n return getRandomValues(rnds8);\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n","// Save global object in a variable\nvar __global__ =\n(typeof globalThis !== 'undefined' && globalThis) ||\n(typeof self !== 'undefined' && self) ||\n(typeof global !== 'undefined' && global);\n// Create an object that extends from __global__ without the fetch function\nvar __globalThis__ = (function () {\nfunction F() {\nthis.fetch = false;\nthis.DOMException = __global__.DOMException\n}\nF.prototype = __global__; // Needed for feature detection on whatwg-fetch's code\nreturn new F();\n})();\n// Wraps whatwg-fetch with a function scope to hijack the global object\n// \"globalThis\" that's going to be patched\n(function(globalThis) {\n\nvar irrelevant = (function (exports) {\n\n /* eslint-disable no-prototype-builtins */\n var g =\n (typeof globalThis !== 'undefined' && globalThis) ||\n (typeof self !== 'undefined' && self) ||\n // eslint-disable-next-line no-undef\n (typeof global !== 'undefined' && global) ||\n {};\n\n var support = {\n searchParams: 'URLSearchParams' in g,\n iterable: 'Symbol' in g && 'iterator' in Symbol,\n blob:\n 'FileReader' in g &&\n 'Blob' in g &&\n (function() {\n try {\n new Blob();\n return true\n } catch (e) {\n return false\n }\n })(),\n formData: 'FormData' in g,\n arrayBuffer: 'ArrayBuffer' in g\n };\n\n function isDataView(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ];\n\n var isArrayBufferView =\n ArrayBuffer.isView ||\n function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n };\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name);\n }\n if (/[^a-z0-9\\-#$%&'*+.^_`|~!]/i.test(name) || name === '') {\n throw new TypeError('Invalid character in header field name: \"' + name + '\"')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value);\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift();\n return {done: value === undefined, value: value}\n }\n };\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n };\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {};\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value);\n }, this);\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n if (header.length != 2) {\n throw new TypeError('Headers constructor: expected name/value pair to be length 2, found' + header.length)\n }\n this.append(header[0], header[1]);\n }, this);\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name]);\n }, this);\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name);\n value = normalizeValue(value);\n var oldValue = this.map[name];\n this.map[name] = oldValue ? oldValue + ', ' + value : value;\n };\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)];\n };\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name);\n return this.has(name) ? this.map[name] : null\n };\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n };\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value);\n };\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this);\n }\n }\n };\n\n Headers.prototype.keys = function() {\n var items = [];\n this.forEach(function(value, name) {\n items.push(name);\n });\n return iteratorFor(items)\n };\n\n Headers.prototype.values = function() {\n var items = [];\n this.forEach(function(value) {\n items.push(value);\n });\n return iteratorFor(items)\n };\n\n Headers.prototype.entries = function() {\n var items = [];\n this.forEach(function(value, name) {\n items.push([name, value]);\n });\n return iteratorFor(items)\n };\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries;\n }\n\n function consumed(body) {\n if (body._noBody) return\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true;\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result);\n };\n reader.onerror = function() {\n reject(reader.error);\n };\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader();\n var promise = fileReaderReady(reader);\n reader.readAsArrayBuffer(blob);\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader();\n var promise = fileReaderReady(reader);\n var match = /charset=([A-Za-z0-9_-]+)/.exec(blob.type);\n var encoding = match ? match[1] : 'utf-8';\n reader.readAsText(blob, encoding);\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf);\n var chars = new Array(view.length);\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i]);\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength);\n view.set(new Uint8Array(buf));\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false;\n\n this._initBody = function(body) {\n /*\n fetch-mock wraps the Response object in an ES6 Proxy to\n provide useful test harness features such as flush. However, on\n ES5 browsers without fetch or Proxy support pollyfills must be used;\n the proxy-pollyfill is unable to proxy an attribute unless it exists\n on the object before the Proxy is created. This change ensures\n Response.bodyUsed exists on the instance, while maintaining the\n semantic of setting Request.bodyUsed in the constructor before\n _initBody is called.\n */\n // eslint-disable-next-line no-self-assign\n this.bodyUsed = this.bodyUsed;\n this._bodyInit = body;\n if (!body) {\n this._noBody = true;\n this._bodyText = '';\n } else if (typeof body === 'string') {\n this._bodyText = body;\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body;\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body;\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString();\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer);\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer]);\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body);\n } else {\n this._bodyText = body = Object.prototype.toString.call(body);\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8');\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type);\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n }\n };\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this);\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n };\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n var isConsumed = consumed(this);\n if (isConsumed) {\n return isConsumed\n } else if (ArrayBuffer.isView(this._bodyArrayBuffer)) {\n return Promise.resolve(\n this._bodyArrayBuffer.buffer.slice(\n this._bodyArrayBuffer.byteOffset,\n this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength\n )\n )\n } else {\n return Promise.resolve(this._bodyArrayBuffer)\n }\n } else if (support.blob) {\n return this.blob().then(readBlobAsArrayBuffer)\n } else {\n throw new Error('could not read as ArrayBuffer')\n }\n };\n\n this.text = function() {\n var rejected = consumed(this);\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n };\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n };\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n };\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['CONNECT', 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'TRACE'];\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase();\n return methods.indexOf(upcased) > -1 ? upcased : method\n }\n\n function Request(input, options) {\n if (!(this instanceof Request)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n\n options = options || {};\n var body = options.body;\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url;\n this.credentials = input.credentials;\n if (!options.headers) {\n this.headers = new Headers(input.headers);\n }\n this.method = input.method;\n this.mode = input.mode;\n this.signal = input.signal;\n if (!body && input._bodyInit != null) {\n body = input._bodyInit;\n input.bodyUsed = true;\n }\n } else {\n this.url = String(input);\n }\n\n this.credentials = options.credentials || this.credentials || 'same-origin';\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers);\n }\n this.method = normalizeMethod(options.method || this.method || 'GET');\n this.mode = options.mode || this.mode || null;\n this.signal = options.signal || this.signal || (function () {\n if ('AbortController' in g) {\n var ctrl = new AbortController();\n return ctrl.signal;\n }\n }());\n this.referrer = null;\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body);\n\n if (this.method === 'GET' || this.method === 'HEAD') {\n if (options.cache === 'no-store' || options.cache === 'no-cache') {\n // Search for a '_' parameter in the query string\n var reParamSearch = /([?&])_=[^&]*/;\n if (reParamSearch.test(this.url)) {\n // If it already exists then set the value with the current time\n this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime());\n } else {\n // Otherwise add a new '_' parameter to the end with the current time\n var reQueryString = /\\?/;\n this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime();\n }\n }\n }\n }\n\n Request.prototype.clone = function() {\n return new Request(this, {body: this._bodyInit})\n };\n\n function decode(body) {\n var form = new FormData();\n body\n .trim()\n .split('&')\n .forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=');\n var name = split.shift().replace(/\\+/g, ' ');\n var value = split.join('=').replace(/\\+/g, ' ');\n form.append(decodeURIComponent(name), decodeURIComponent(value));\n }\n });\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers();\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ');\n // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill\n // https://github.com/github/fetch/issues/748\n // https://github.com/zloirock/core-js/issues/751\n preProcessedHeaders\n .split('\\r')\n .map(function(header) {\n return header.indexOf('\\n') === 0 ? header.substr(1, header.length) : header\n })\n .forEach(function(line) {\n var parts = line.split(':');\n var key = parts.shift().trim();\n if (key) {\n var value = parts.join(':').trim();\n try {\n headers.append(key, value);\n } catch (error) {\n console.warn('Response ' + error.message);\n }\n }\n });\n return headers\n }\n\n Body.call(Request.prototype);\n\n function Response(bodyInit, options) {\n if (!(this instanceof Response)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n if (!options) {\n options = {};\n }\n\n this.type = 'default';\n this.status = options.status === undefined ? 200 : options.status;\n if (this.status < 200 || this.status > 599) {\n throw new RangeError(\"Failed to construct 'Response': The status provided (0) is outside the range [200, 599].\")\n }\n this.ok = this.status >= 200 && this.status < 300;\n this.statusText = options.statusText === undefined ? '' : '' + options.statusText;\n this.headers = new Headers(options.headers);\n this.url = options.url || '';\n this._initBody(bodyInit);\n }\n\n Body.call(Response.prototype);\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n };\n\n Response.error = function() {\n var response = new Response(null, {status: 200, statusText: ''});\n response.ok = false;\n response.status = 0;\n response.type = 'error';\n return response\n };\n\n var redirectStatuses = [301, 302, 303, 307, 308];\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n };\n\n exports.DOMException = g.DOMException;\n try {\n new exports.DOMException();\n } catch (err) {\n exports.DOMException = function(message, name) {\n this.message = message;\n this.name = name;\n var error = Error(message);\n this.stack = error.stack;\n };\n exports.DOMException.prototype = Object.create(Error.prototype);\n exports.DOMException.prototype.constructor = exports.DOMException;\n }\n\n function fetch(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init);\n\n if (request.signal && request.signal.aborted) {\n return reject(new exports.DOMException('Aborted', 'AbortError'))\n }\n\n var xhr = new XMLHttpRequest();\n\n function abortXhr() {\n xhr.abort();\n }\n\n xhr.onload = function() {\n var options = {\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n };\n // This check if specifically for when a user fetches a file locally from the file system\n // Only if the status is out of a normal range\n if (request.url.indexOf('file://') === 0 && (xhr.status < 200 || xhr.status > 599)) {\n options.status = 200;\n } else {\n options.status = xhr.status;\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');\n var body = 'response' in xhr ? xhr.response : xhr.responseText;\n setTimeout(function() {\n resolve(new Response(body, options));\n }, 0);\n };\n\n xhr.onerror = function() {\n setTimeout(function() {\n reject(new TypeError('Network request failed'));\n }, 0);\n };\n\n xhr.ontimeout = function() {\n setTimeout(function() {\n reject(new TypeError('Network request timed out'));\n }, 0);\n };\n\n xhr.onabort = function() {\n setTimeout(function() {\n reject(new exports.DOMException('Aborted', 'AbortError'));\n }, 0);\n };\n\n function fixUrl(url) {\n try {\n return url === '' && g.location.href ? g.location.href : url\n } catch (e) {\n return url\n }\n }\n\n xhr.open(request.method, fixUrl(request.url), true);\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true;\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false;\n }\n\n if ('responseType' in xhr) {\n if (support.blob) {\n xhr.responseType = 'blob';\n } else if (\n support.arrayBuffer\n ) {\n xhr.responseType = 'arraybuffer';\n }\n }\n\n if (init && typeof init.headers === 'object' && !(init.headers instanceof Headers || (g.Headers && init.headers instanceof g.Headers))) {\n var names = [];\n Object.getOwnPropertyNames(init.headers).forEach(function(name) {\n names.push(normalizeName(name));\n xhr.setRequestHeader(name, normalizeValue(init.headers[name]));\n });\n request.headers.forEach(function(value, name) {\n if (names.indexOf(name) === -1) {\n xhr.setRequestHeader(name, value);\n }\n });\n } else {\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value);\n });\n }\n\n if (request.signal) {\n request.signal.addEventListener('abort', abortXhr);\n\n xhr.onreadystatechange = function() {\n // DONE (success or failure)\n if (xhr.readyState === 4) {\n request.signal.removeEventListener('abort', abortXhr);\n }\n };\n }\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);\n })\n }\n\n fetch.polyfill = true;\n\n if (!g.fetch) {\n g.fetch = fetch;\n g.Headers = Headers;\n g.Request = Request;\n g.Response = Response;\n }\n\n exports.Headers = Headers;\n exports.Request = Request;\n exports.Response = Response;\n exports.fetch = fetch;\n\n return exports;\n\n})({});\n})(__globalThis__);\n// This is a ponyfill, so...\n__globalThis__.fetch.ponyfill = true;\ndelete __globalThis__.fetch.polyfill;\n// Choose between native implementation (__global__) or custom implementation (__globalThis__)\nvar ctx = __global__.fetch ? __global__ : __globalThis__;\nexports = ctx.fetch // To enable: import fetch from 'cross-fetch'\nexports.default = ctx.fetch // For TypeScript consumers without esModuleInterop.\nexports.fetch = ctx.fetch // To enable: import {fetch} from 'cross-fetch'\nexports.Headers = ctx.Headers\nexports.Request = ctx.Request\nexports.Response = ctx.Response\nmodule.exports = exports\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","var __defProp = Object.defineProperty;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __glob = (map) => (path2) => {\n var fn = map[path2];\n if (fn) return fn();\n throw new Error(\"Module not found in bundle: \" + path2);\n};\nvar __esm = (fn, res) => function __init() {\n return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;\n};\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\n\n// src/core/interfaces/adminDB.ts\nvar init_adminDB = __esm({\n \"src/core/interfaces/adminDB.ts\"() {\n \"use strict\";\n }\n});\n\n// src/core/interfaces/classroomDB.ts\nvar init_classroomDB = __esm({\n \"src/core/interfaces/classroomDB.ts\"() {\n \"use strict\";\n }\n});\n\n// src/impl/common/SyncStrategy.ts\nvar init_SyncStrategy = __esm({\n \"src/impl/common/SyncStrategy.ts\"() {\n \"use strict\";\n }\n});\n\n// src/util/logger.ts\nvar isDevelopment, logger;\nvar init_logger = __esm({\n \"src/util/logger.ts\"() {\n \"use strict\";\n isDevelopment = typeof process !== \"undefined\" && process.env.NODE_ENV === \"development\";\n logger = {\n /**\n * Debug-level logging - only shown in development\n */\n debug: (message, ...args) => {\n if (isDevelopment) {\n console.debug(`[DB:DEBUG] ${message}`, ...args);\n }\n },\n /**\n * Info-level logging - general information\n */\n info: (message, ...args) => {\n console.info(`[DB:INFO] ${message}`, ...args);\n },\n /**\n * Warning-level logging - potential issues\n */\n warn: (message, ...args) => {\n console.warn(`[DB:WARN] ${message}`, ...args);\n },\n /**\n * Error-level logging - serious problems\n */\n error: (message, ...args) => {\n console.error(`[DB:ERROR] ${message}`, ...args);\n },\n /**\n * Log function for backward compatibility with existing log() usage\n */\n log: (message, ...args) => {\n if (isDevelopment) {\n console.log(`[DB:LOG] ${message}`, ...args);\n }\n }\n };\n }\n});\n\n// src/core/types/types-legacy.ts\nvar GuestUsername, log, DocType, DocTypePrefixes;\nvar init_types_legacy = __esm({\n \"src/core/types/types-legacy.ts\"() {\n \"use strict\";\n init_logger();\n GuestUsername = \"sk-guest-\";\n log = (message) => {\n logger.log(message);\n };\n DocType = /* @__PURE__ */ ((DocType3) => {\n DocType3[\"DISPLAYABLE_DATA\"] = \"DISPLAYABLE_DATA\";\n DocType3[\"CARD\"] = \"CARD\";\n DocType3[\"DATASHAPE\"] = \"DATASHAPE\";\n DocType3[\"QUESTIONTYPE\"] = \"QUESTION\";\n DocType3[\"VIEW\"] = \"VIEW\";\n DocType3[\"PEDAGOGY\"] = \"PEDAGOGY\";\n DocType3[\"CARDRECORD\"] = \"CARDRECORD\";\n DocType3[\"SCHEDULED_CARD\"] = \"SCHEDULED_CARD\";\n DocType3[\"TAG\"] = \"TAG\";\n DocType3[\"NAVIGATION_STRATEGY\"] = \"NAVIGATION_STRATEGY\";\n DocType3[\"STRATEGY_STATE\"] = \"STRATEGY_STATE\";\n DocType3[\"USER_OUTCOME\"] = \"USER_OUTCOME\";\n DocType3[\"STRATEGY_LEARNING_STATE\"] = \"STRATEGY_LEARNING_STATE\";\n return DocType3;\n })(DocType || {});\n DocTypePrefixes = {\n [\"CARD\" /* CARD */]: \"c\",\n [\"DISPLAYABLE_DATA\" /* DISPLAYABLE_DATA */]: \"dd\",\n [\"TAG\" /* TAG */]: \"TAG\",\n [\"CARDRECORD\" /* CARDRECORD */]: \"cardH\",\n [\"SCHEDULED_CARD\" /* SCHEDULED_CARD */]: \"card_review_\",\n // Add other doctypes here as they get prefixed IDs\n [\"DATASHAPE\" /* DATASHAPE */]: \"DATASHAPE\",\n [\"QUESTION\" /* QUESTIONTYPE */]: \"QUESTION\",\n [\"VIEW\" /* VIEW */]: \"VIEW\",\n [\"PEDAGOGY\" /* PEDAGOGY */]: \"PEDAGOGY\",\n [\"NAVIGATION_STRATEGY\" /* NAVIGATION_STRATEGY */]: \"NAVIGATION_STRATEGY\",\n [\"STRATEGY_STATE\" /* STRATEGY_STATE */]: \"STRATEGY_STATE\",\n [\"USER_OUTCOME\" /* USER_OUTCOME */]: \"USER_OUTCOME\",\n [\"STRATEGY_LEARNING_STATE\" /* STRATEGY_LEARNING_STATE */]: \"STRATEGY_LEARNING_STATE\"\n };\n }\n});\n\n// src/core/util/index.ts\nfunction areQuestionRecords(h) {\n return isQuestionRecord(h.records[0]);\n}\nfunction isQuestionRecord(c) {\n return c.userAnswer !== void 0;\n}\nfunction getCardHistoryID(courseID, cardID) {\n return `${DocTypePrefixes[\"CARDRECORD\" /* CARDRECORD */]}-${courseID}-${cardID}`;\n}\nfunction parseCardHistoryID(id) {\n const split = id.split(\"-\");\n let error = \"\";\n error += split.length === 3 ? \"\" : `\n\tgiven ID has incorrect number of '-' characters`;\n error += split[0] === DocTypePrefixes[\"CARDRECORD\" /* CARDRECORD */] ? \"\" : `\n\tgiven ID does not start with ${DocTypePrefixes[\"CARDRECORD\" /* CARDRECORD */]}`;\n if (split.length === 3 && split[0] === DocTypePrefixes[\"CARDRECORD\" /* CARDRECORD */]) {\n return {\n courseID: split[1],\n cardID: split[2]\n };\n } else {\n throw new Error(\"parseCardHistory Error:\" + error);\n }\n}\nfunction docIsDeleted(e) {\n return Boolean(e?.error === \"not_found\" && e?.reason === \"deleted\");\n}\nvar init_util = __esm({\n \"src/core/util/index.ts\"() {\n \"use strict\";\n init_types_legacy();\n }\n});\n\n// src/impl/couch/pouchdb-setup.ts\nimport PouchDB from \"pouchdb\";\nimport PouchDBFind from \"pouchdb-find\";\nimport PouchDBAuth from \"@nilock2/pouchdb-authentication\";\nvar pouchdb_setup_default;\nvar init_pouchdb_setup = __esm({\n \"src/impl/couch/pouchdb-setup.ts\"() {\n \"use strict\";\n PouchDB.plugin(PouchDBFind);\n PouchDB.plugin(PouchDBAuth);\n if (typeof PouchDB.debug !== \"undefined\") {\n PouchDB.debug.disable();\n }\n PouchDB.defaults({\n // ajax: {\n // timeout: 60000,\n // },\n });\n pouchdb_setup_default = PouchDB;\n }\n});\n\n// src/util/dataDirectory.ts\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nfunction getAppDataDirectory() {\n if (ENV.LOCAL_STORAGE_PREFIX) {\n return path.join(os.homedir(), `.tuilder`, ENV.LOCAL_STORAGE_PREFIX);\n } else {\n return path.join(os.homedir(), \".tuilder\");\n }\n}\nasync function ensureAppDataDirectory() {\n const appDataDir = getAppDataDirectory();\n try {\n await fs.promises.mkdir(appDataDir, { recursive: true });\n } catch (err) {\n if (err.code !== \"EEXIST\") {\n throw new Error(`Failed to create app data directory ${appDataDir}: ${err.message}`);\n }\n }\n return appDataDir;\n}\nfunction getDbPath(dbName) {\n return path.join(getAppDataDirectory(), dbName);\n}\nasync function initializeDataDirectory() {\n await ensureAppDataDirectory();\n logger.info(`PouchDB data directory initialized: ${getAppDataDirectory()}`);\n}\nvar init_dataDirectory = __esm({\n \"src/util/dataDirectory.ts\"() {\n \"use strict\";\n init_logger();\n init_factory();\n }\n});\n\n// src/impl/common/userDBHelpers.ts\nimport moment from \"moment\";\nfunction hexEncode(str) {\n let hex;\n let returnStr = \"\";\n for (let i = 0; i < str.length; i++) {\n hex = str.charCodeAt(i).toString(16);\n returnStr += (\"000\" + hex).slice(3);\n }\n return returnStr;\n}\nfunction filterAllDocsByPrefix(db, prefix, opts) {\n const options = {\n startkey: prefix,\n endkey: prefix + \"\\uFFF0\",\n include_docs: true\n };\n if (opts) {\n Object.assign(options, opts);\n }\n return db.allDocs(options);\n}\nfunction getStartAndEndKeys(key) {\n return {\n startkey: key,\n endkey: key + \"\\uFFF0\"\n };\n}\nfunction updateGuestAccountExpirationDate(guestDB) {\n const currentTime = moment.utc();\n const expirationDate = currentTime.add(2, \"months\").toISOString();\n const expiryDocID = \"GuestAccountExpirationDate\";\n void guestDB.get(expiryDocID).then((doc) => {\n return guestDB.put({\n _id: expiryDocID,\n _rev: doc._rev,\n date: expirationDate\n });\n }).catch(() => {\n return guestDB.put({\n _id: expiryDocID,\n date: expirationDate\n });\n });\n}\nfunction getLocalUserDB(username) {\n const dbName = `userdb-${username}`;\n if (typeof window === \"undefined\") {\n return new pouchdb_setup_default(getDbPath(dbName), {});\n } else {\n return new pouchdb_setup_default(dbName, {});\n }\n}\nfunction scheduleCardReviewLocal(userDB, review) {\n const now = moment.utc();\n logger.info(`Scheduling for review in: ${review.time.diff(now, \"h\") / 24} days`);\n void userDB.put({\n _id: DocTypePrefixes[\"SCHEDULED_CARD\" /* SCHEDULED_CARD */] + review.time.format(REVIEW_TIME_FORMAT),\n cardId: review.card_id,\n reviewTime: review.time.toISOString(),\n courseId: review.course_id,\n scheduledAt: now.toISOString(),\n scheduledFor: review.scheduledFor,\n schedulingAgentId: review.schedulingAgentId\n });\n}\nasync function removeScheduledCardReviewLocal(userDB, reviewDocID) {\n const reviewDoc = await userDB.get(reviewDocID);\n userDB.remove(reviewDoc).then((res) => {\n if (res.ok) {\n log2(`Removed Review Doc: ${reviewDocID}`);\n }\n }).catch((err) => {\n log2(`Failed to remove Review Doc: ${reviewDocID},\n${JSON.stringify(err)}`);\n });\n}\nvar REVIEW_TIME_FORMAT, log2;\nvar init_userDBHelpers = __esm({\n \"src/impl/common/userDBHelpers.ts\"() {\n \"use strict\";\n init_core();\n init_logger();\n init_pouchdb_setup();\n init_dataDirectory();\n REVIEW_TIME_FORMAT = \"YYYY-MM-DD--kk:mm:ss-SSS\";\n log2 = (s) => {\n logger.info(s);\n };\n }\n});\n\n// src/util/Loggable.ts\nvar Loggable;\nvar init_Loggable = __esm({\n \"src/util/Loggable.ts\"() {\n \"use strict\";\n Loggable = class {\n log(...args) {\n console.log(`LOG-${this._className}@${/* @__PURE__ */ new Date()}:`, ...args);\n }\n error(...args) {\n console.error(`ERROR-${this._className}@${/* @__PURE__ */ new Date()}:`, ...args);\n }\n };\n }\n});\n\n// src/impl/couch/updateQueue.ts\nvar UpdateQueue;\nvar init_updateQueue = __esm({\n \"src/impl/couch/updateQueue.ts\"() {\n \"use strict\";\n init_Loggable();\n init_logger();\n UpdateQueue = class extends Loggable {\n _className = \"UpdateQueue\";\n pendingUpdates = {};\n inprogressUpdates = {};\n readDB;\n // Database for read operations\n writeDB;\n // Database for write operations (local-first)\n /**\n * Queues an update for a document and applies it with conflict resolution.\n *\n * @param id - Document ID to update\n * @param update - Partial object or function that transforms the document\n * @returns Promise resolving to the updated document\n *\n * @throws {PouchError} with status 404 if document doesn't exist\n *\n * @remarks\n * **Error Handling Pattern:**\n * - This method does NOT create documents if they don't exist\n * - Callers are responsible for handling 404 errors and creating documents\n * - This design maintains separation of concerns (UpdateQueue handles conflicts, callers handle lifecycle)\n *\n * @example\n * ```typescript\n * try {\n * await updateQueue.update(docId, (doc) => ({ ...doc, field: newValue }));\n * } catch (e) {\n * if ((e as PouchError).status === 404) {\n * // Create the document with initial values\n * await db.put({ _id: docId, field: newValue, ...initialFields });\n * }\n * }\n * ```\n */\n update(id, update) {\n logger.debug(`Update requested on doc: ${id}`);\n if (this.pendingUpdates[id]) {\n this.pendingUpdates[id].push(update);\n } else {\n this.pendingUpdates[id] = [update];\n }\n return this.applyUpdates(id);\n }\n constructor(readDB, writeDB) {\n super();\n this.readDB = readDB;\n this.writeDB = writeDB || readDB;\n logger.debug(`UpdateQ initialized...`);\n void this.readDB.info().then((i) => {\n logger.debug(`db info: ${JSON.stringify(i)}`);\n });\n }\n async applyUpdates(id) {\n logger.debug(`Applying updates on doc: ${id}`);\n if (this.inprogressUpdates[id]) {\n while (this.inprogressUpdates[id]) {\n await new Promise((resolve) => setTimeout(resolve, Math.random() * 50));\n }\n return this.applyUpdates(id);\n } else {\n if (this.pendingUpdates[id] && this.pendingUpdates[id].length > 0) {\n this.inprogressUpdates[id] = true;\n const MAX_RETRIES = 5;\n for (let i = 0; i < MAX_RETRIES; i++) {\n try {\n const doc = await this.readDB.get(id);\n let updatedDoc = { ...doc };\n const updatesToApply = [...this.pendingUpdates[id]];\n for (const update of updatesToApply) {\n if (typeof update === \"function\") {\n updatedDoc = { ...updatedDoc, ...update(updatedDoc) };\n } else {\n updatedDoc = {\n ...updatedDoc,\n ...update\n };\n }\n }\n await this.writeDB.put(updatedDoc);\n this.pendingUpdates[id].splice(0, updatesToApply.length);\n if (this.pendingUpdates[id].length === 0) {\n this.inprogressUpdates[id] = false;\n delete this.inprogressUpdates[id];\n } else {\n return this.applyUpdates(id);\n }\n return updatedDoc;\n } catch (e) {\n if (e.name === \"conflict\" && i < MAX_RETRIES - 1) {\n logger.warn(`Conflict on update for doc ${id}, retry #${i + 1}`);\n await new Promise((res) => setTimeout(res, 50 * Math.random()));\n } else if (e.name === \"not_found\" && i === 0) {\n logger.warn(`Update failed for ${id} - does not exist. Throwing to caller.`);\n delete this.inprogressUpdates[id];\n throw e;\n } else {\n delete this.inprogressUpdates[id];\n if (this.pendingUpdates[id]) {\n delete this.pendingUpdates[id];\n }\n logger.error(`Error on attemped update (retry ${i}): ${JSON.stringify(e)}`);\n throw e;\n }\n }\n }\n throw new Error(`UpdateQueue failed for doc ${id} after ${MAX_RETRIES} retries.`);\n } else {\n throw new Error(`Empty Updates Queue Triggered`);\n }\n }\n }\n };\n }\n});\n\n// src/impl/couch/user-course-relDB.ts\nimport moment2 from \"moment\";\nvar UsrCrsData;\nvar init_user_course_relDB = __esm({\n \"src/impl/couch/user-course-relDB.ts\"() {\n \"use strict\";\n init_logger();\n UsrCrsData = class {\n user;\n _courseId;\n constructor(user, courseId) {\n this.user = user;\n this._courseId = courseId;\n }\n async getReviewsForcast(daysCount) {\n const time = moment2.utc().add(daysCount, \"days\");\n return this.getReviewstoDate(time);\n }\n async getPendingReviews() {\n const now = moment2.utc();\n return this.getReviewstoDate(now);\n }\n async getScheduledReviewCount() {\n return (await this.getPendingReviews()).length;\n }\n async getCourseSettings() {\n const regDoc = await this.user.getCourseRegistrationsDoc();\n const crsDoc = regDoc.courses.find((c) => c.courseID === this._courseId);\n if (crsDoc && crsDoc.settings) {\n return crsDoc.settings;\n } else {\n logger.warn(`no settings found during lookup on course ${this._courseId}`);\n return {};\n }\n }\n updateCourseSettings(updates) {\n if (\"updateCourseSettings\" in this.user) {\n void this.user.updateCourseSettings(this._courseId, updates);\n }\n }\n async getStrategyState(strategyKey) {\n return this.user.getStrategyState(this._courseId, strategyKey);\n }\n async putStrategyState(strategyKey, data) {\n return this.user.putStrategyState(this._courseId, strategyKey, data);\n }\n async deleteStrategyState(strategyKey) {\n return this.user.deleteStrategyState(this._courseId, strategyKey);\n }\n async getReviewstoDate(targetDate) {\n const allReviews = await this.user.getPendingReviews(this._courseId);\n logger.debug(\n `Fetching ${this.user.getUsername()}'s scheduled reviews for course ${this._courseId}.`\n );\n return allReviews.filter((review) => {\n const reviewTime = moment2.utc(review.reviewTime);\n return targetDate.isAfter(reviewTime);\n });\n }\n };\n }\n});\n\n// src/impl/couch/clientCache.ts\nasync function GET_CACHED(k, f) {\n if (CLIENT_CACHE[k]) {\n return CLIENT_CACHE[k];\n }\n CLIENT_CACHE[k] = f ? await f(k) : await GET_ITEM(k);\n return GET_CACHED(k);\n}\nasync function GET_ITEM(k) {\n throw new Error(`No implementation found for GET_CACHED(${k})`);\n}\nvar CLIENT_CACHE;\nvar init_clientCache = __esm({\n \"src/impl/couch/clientCache.ts\"() {\n \"use strict\";\n CLIENT_CACHE = {};\n }\n});\n\n// src/impl/couch/courseAPI.ts\nimport { NameSpacer } from \"@vue-skuilder/common\";\nimport { blankCourseElo, toCourseElo } from \"@vue-skuilder/common\";\nimport { prepareNote55 } from \"@vue-skuilder/common\";\nimport { v4 as uuidv4 } from \"uuid\";\nasync function addNote55(courseID, codeCourse, shape, data, author, tags, uploads, elo = blankCourseElo()) {\n const db = getCourseDB(courseID);\n const payload = prepareNote55(courseID, codeCourse, shape, data, author, tags, uploads);\n const _id = `${DocTypePrefixes[\"DISPLAYABLE_DATA\" /* DISPLAYABLE_DATA */]}-${uuidv4()}`;\n const result = await db.put({ ...payload, _id });\n const dataShapeId = NameSpacer.getDataShapeString({\n course: codeCourse,\n dataShape: shape.name\n });\n if (result.ok) {\n try {\n await createCards(courseID, dataShapeId, result.id, tags, elo, author);\n } catch (error) {\n let errorMessage = \"Unknown error\";\n if (error instanceof Error) {\n errorMessage = error.message;\n } else if (error && typeof error === \"object\" && \"reason\" in error) {\n errorMessage = error.reason;\n } else if (error && typeof error === \"object\" && \"message\" in error) {\n errorMessage = error.message;\n } else {\n errorMessage = String(error);\n }\n logger.error(`[addNote55] Failed to create cards for note ${result.id}: ${errorMessage}`);\n result.cardCreationFailed = true;\n result.cardCreationError = errorMessage;\n }\n } else {\n logger.error(`[addNote55] Error adding note. Result: ${JSON.stringify(result)}`);\n }\n return result;\n}\nasync function createCards(courseID, datashapeID, noteID, tags, elo = blankCourseElo(), author) {\n const cfg = await getCredentialledCourseConfig(courseID);\n const dsDescriptor = NameSpacer.getDataShapeDescriptor(datashapeID);\n let questionViewTypes = [];\n for (const ds of cfg.dataShapes) {\n if (ds.name === datashapeID) {\n questionViewTypes = ds.questionTypes;\n }\n }\n if (questionViewTypes.length === 0) {\n const errorMsg = `No questionViewTypes found for datashapeID: ${datashapeID} in course config. Cards cannot be created.`;\n logger.error(errorMsg);\n throw new Error(errorMsg);\n }\n for (const questionView of questionViewTypes) {\n await createCard(questionView, courseID, dsDescriptor, noteID, tags, elo, author);\n }\n}\nasync function createCard(questionViewName, courseID, dsDescriptor, noteID, tags, elo = blankCourseElo(), author) {\n const qDescriptor = NameSpacer.getQuestionDescriptor(questionViewName);\n const cfg = await getCredentialledCourseConfig(courseID);\n for (const rQ of cfg.questionTypes) {\n if (rQ.name === questionViewName) {\n for (const view of rQ.viewList) {\n await addCard(\n courseID,\n dsDescriptor.course,\n [noteID],\n NameSpacer.getViewString({\n course: qDescriptor.course,\n questionType: qDescriptor.questionType,\n view\n }),\n elo,\n tags,\n author\n );\n }\n }\n }\n}\nasync function addCard(courseID, course, id_displayable_data, id_view, elo, tags, author) {\n const db = getCourseDB(courseID);\n const _id = `${DocTypePrefixes[\"CARD\" /* CARD */]}-${uuidv4()}`;\n const card = await db.put({\n _id,\n course,\n id_displayable_data,\n id_view,\n docType: \"CARD\" /* CARD */,\n elo: elo || toCourseElo(990 + Math.round(20 * Math.random())),\n author\n });\n for (const tag of tags) {\n logger.info(`adding tag: ${tag} to card ${card.id}`);\n await addTagToCard(courseID, card.id, tag, author, false);\n }\n return card;\n}\nasync function getCredentialledCourseConfig(courseID) {\n try {\n const db = getCourseDB(courseID);\n const ret = await db.get(\"CourseConfig\");\n ret.courseID = courseID;\n logger.info(`Returning course config: ${JSON.stringify(ret)}`);\n return ret;\n } catch (e) {\n logger.error(`Error fetching config for ${courseID}:`, e);\n throw e;\n }\n}\nasync function addTagToCard(courseID, cardID, tagID, author, updateELO = true) {\n const prefixedTagID = getTagID(tagID);\n const courseDB = getCourseDB(courseID);\n const courseApi = new CourseDB(courseID, async () => {\n const dummySyncStrategy = {\n setupRemoteDB: () => null,\n startSync: () => {\n },\n canCreateAccount: () => false,\n canAuthenticate: () => false,\n getCurrentUsername: async () => \"DummyUser\"\n };\n return BaseUser.Dummy(dummySyncStrategy);\n });\n try {\n logger.info(`Applying tag ${tagID} to card ${courseID + \"-\" + cardID}...`);\n const tag = await courseDB.get(prefixedTagID);\n if (!tag.taggedCards.includes(cardID)) {\n tag.taggedCards.push(cardID);\n if (updateELO) {\n try {\n const eloData = await courseApi.getCardEloData([cardID]);\n const elo = eloData[0];\n elo.tags[tagID] = {\n count: 0,\n score: elo.global.score\n // todo: or 1000?\n };\n await updateCardElo(courseID, cardID, elo);\n } catch (error) {\n logger.error(\"Failed to update ELO data for card:\", cardID, error);\n }\n }\n return courseDB.put(tag);\n } else throw new AlreadyTaggedErr(`Card ${cardID} is already tagged with ${tagID}`);\n } catch (e) {\n if (e instanceof AlreadyTaggedErr) {\n throw e;\n }\n await createTag(courseID, tagID, author);\n return addTagToCard(courseID, cardID, tagID, author, updateELO);\n }\n}\nasync function updateCardElo(courseID, cardID, elo) {\n if (elo) {\n const cDB = getCourseDB(courseID);\n const card = await cDB.get(cardID);\n logger.debug(`Replacing ${JSON.stringify(card.elo)} with ${JSON.stringify(elo)}`);\n card.elo = elo;\n return cDB.put(card);\n }\n}\nfunction getTagID(tagName) {\n const tagPrefix = \"TAG\" /* TAG */.valueOf() + \"-\";\n if (tagName.indexOf(tagPrefix) === 0) {\n return tagName;\n } else {\n return tagPrefix + tagName;\n }\n}\nfunction getCourseDB(courseID) {\n const dbName = `coursedb-${courseID}`;\n return new pouchdb_setup_default(\n ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + dbName,\n createPouchDBConfig()\n );\n}\nvar AlreadyTaggedErr;\nvar init_courseAPI = __esm({\n \"src/impl/couch/courseAPI.ts\"() {\n \"use strict\";\n init_pouchdb_setup();\n init_couch();\n init_factory();\n init_courseDB();\n init_types_legacy();\n init_common();\n init_logger();\n AlreadyTaggedErr = class extends Error {\n constructor(message) {\n super(message);\n this.name = \"AlreadyTaggedErr\";\n }\n };\n }\n});\n\n// src/impl/couch/courseLookupDB.ts\nvar courseLookupDBTitle, CourseLookup;\nvar init_courseLookupDB = __esm({\n \"src/impl/couch/courseLookupDB.ts\"() {\n \"use strict\";\n init_pouchdb_setup();\n init_factory();\n init_logger();\n courseLookupDBTitle = \"coursedb-lookup\";\n logger.debug(`COURSELOOKUP FILE RUNNING`);\n CourseLookup = class _CourseLookup {\n // [ ] this db should be read only for public, admin-only for write\n // Cache for the PouchDB instance\n static _dbInstance = null;\n /**\n * Static getter for the PouchDB database instance.\n * Connects using ENV variables and caches the instance.\n * Throws an error if required ENV variables are not set.\n */\n static get _db() {\n if (this._dbInstance) {\n return this._dbInstance;\n }\n if (ENV.COUCHDB_SERVER_URL === \"NOT_SET\" || !ENV.COUCHDB_SERVER_URL) {\n throw new Error(\n \"CourseLookup.db: COUCHDB_SERVER_URL is not set. Ensure initializeDataLayer has been called with valid configuration.\"\n );\n }\n if (ENV.COUCHDB_SERVER_PROTOCOL === \"NOT_SET\" || !ENV.COUCHDB_SERVER_PROTOCOL) {\n throw new Error(\n \"CourseLookup.db: COUCHDB_SERVER_PROTOCOL is not set. Ensure initializeDataLayer has been called with valid configuration.\"\n );\n }\n const dbUrl = `${ENV.COUCHDB_SERVER_PROTOCOL}://${ENV.COUCHDB_SERVER_URL}/${courseLookupDBTitle}`;\n const options = {\n // fetch: (url, opts) => { // Optional: Add for debugging network requests\n // console.log('PouchDB fetch:', url, opts);\n // return pouch.fetch(url, opts);\n // }\n };\n if (ENV.COUCHDB_USERNAME && ENV.COUCHDB_PASSWORD) {\n options.auth = {\n username: ENV.COUCHDB_USERNAME,\n password: ENV.COUCHDB_PASSWORD\n };\n logger.info(`CourseLookup: Connecting to ${dbUrl} with authentication.`);\n } else {\n logger.info(`CourseLookup: Connecting to ${dbUrl} without authentication.`);\n }\n try {\n this._dbInstance = new pouchdb_setup_default(dbUrl, options);\n logger.info(`CourseLookup: Database instance created for ${courseLookupDBTitle}.`);\n return this._dbInstance;\n } catch (error) {\n logger.error(`CourseLookup: Failed to create PouchDB instance for ${dbUrl}`, error);\n this._dbInstance = null;\n throw new Error(\n `CourseLookup: Failed to initialize database connection: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n /**\n * Adds a new course to the lookup database, and returns the courseID\n * @param courseName\n * @returns\n */\n static async add(courseName) {\n const resp = await _CourseLookup._db.post({\n name: courseName\n });\n return resp.id;\n }\n /**\n * Adds a new course to the lookup database with a specific courseID\n * @param courseId The specific course ID to use\n * @param courseName The course name\n * @param disambiguator Optional disambiguator\n * @returns Promise<void>\n */\n static async addWithId(courseId, courseName, disambiguator) {\n const doc = {\n _id: courseId,\n name: courseName\n };\n if (disambiguator) {\n doc.disambiguator = disambiguator;\n }\n await _CourseLookup._db.put(doc);\n }\n /**\n * Removes a course from the index\n * @param courseID\n */\n static async delete(courseID) {\n const doc = await _CourseLookup._db.get(courseID);\n return await _CourseLookup._db.remove(doc);\n }\n // [ ] rename to allCourses()\n static async allCourseWare() {\n const resp = await _CourseLookup._db.allDocs({\n include_docs: true\n });\n return resp.rows.map((row) => row.doc);\n }\n static async updateDisambiguator(courseID, disambiguator) {\n const doc = await _CourseLookup._db.get(courseID);\n doc.disambiguator = disambiguator;\n return await _CourseLookup._db.put(doc);\n }\n static async isCourse(courseID) {\n try {\n await _CourseLookup._db.get(courseID);\n return true;\n } catch (error) {\n logger.info(`Courselookup failed:`, error);\n return false;\n }\n }\n };\n }\n});\n\n// src/core/navigators/PipelineDebugger.ts\nvar PipelineDebugger_exports = {};\n__export(PipelineDebugger_exports, {\n buildRunReport: () => buildRunReport,\n captureRun: () => captureRun,\n mountPipelineDebugger: () => mountPipelineDebugger,\n pipelineDebugAPI: () => pipelineDebugAPI,\n registerPipelineForDebug: () => registerPipelineForDebug\n});\nfunction registerPipelineForDebug(pipeline) {\n _activePipeline = pipeline;\n}\nfunction getOrigin(card) {\n const firstEntry = card.provenance[0];\n if (!firstEntry) return \"unknown\";\n const reason = firstEntry.reason?.toLowerCase() || \"\";\n const strategy = firstEntry.strategy?.toLowerCase() || \"\";\n if (reason.includes(\"new card\") || strategy.includes(\"elo\")) return \"new\";\n if (reason.includes(\"review\") || strategy.includes(\"srs\")) return \"review\";\n return \"unknown\";\n}\nfunction captureRun(report) {\n const fullReport = {\n ...report,\n runId: `run-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n timestamp: /* @__PURE__ */ new Date()\n };\n runHistory.unshift(fullReport);\n if (runHistory.length > MAX_RUNS) {\n runHistory.pop();\n }\n}\nfunction parseCardElo(provenance) {\n const eloEntry = provenance.find((p) => p.strategy === \"elo\");\n if (!eloEntry?.reason) return void 0;\n const match = eloEntry.reason.match(/card:\\s*(\\d+)/);\n return match ? parseInt(match[1], 10) : void 0;\n}\nfunction buildRunReport(courseId, courseName, generatorName, generators, generatedCount, filters, allCards, selectedCards, userElo, hints) {\n const selectedIds = new Set(selectedCards.map((c) => c.cardId));\n const cards = allCards.map((card) => ({\n cardId: card.cardId,\n courseId: card.courseId,\n origin: getOrigin(card),\n generator: card.provenance[0]?.strategyName || card.provenance[0]?.strategy,\n finalScore: card.score,\n cardElo: parseCardElo(card.provenance),\n provenance: card.provenance,\n tags: card.tags,\n selected: selectedIds.has(card.cardId)\n }));\n const reviewsSelected = selectedCards.filter((c) => getOrigin(c) === \"review\").length;\n const newSelected = selectedCards.filter((c) => getOrigin(c) === \"new\").length;\n return {\n courseId,\n courseName,\n userElo,\n generatorName,\n generators,\n generatedCount,\n filters,\n hints,\n finalCount: selectedCards.length,\n reviewsSelected,\n newSelected,\n cards\n };\n}\nfunction formatProvenance(provenance) {\n return provenance.map((p) => {\n const actionSymbol = p.action === \"generated\" ? \"\\u{1F3B2}\" : p.action === \"boosted\" ? \"\\u2B06\\uFE0F\" : p.action === \"penalized\" ? \"\\u2B07\\uFE0F\" : \"\\u27A1\\uFE0F\";\n return ` ${actionSymbol} ${p.strategyName}: ${p.score.toFixed(3)} - ${p.reason}`;\n }).join(\"\\n\");\n}\nfunction printRunSummary(run) {\n console.group(`\\u{1F50D} Pipeline Run: ${run.courseId} (${run.courseName || \"unnamed\"})`);\n logger.info(`Run ID: ${run.runId}`);\n logger.info(`Time: ${run.timestamp.toISOString()}`);\n logger.info(`User ELO: ${run.userElo ?? \"unknown\"}`);\n logger.info(`Generator: ${run.generatorName} \\u2192 ${run.generatedCount} candidates`);\n if (run.generators && run.generators.length > 0) {\n console.group(\"Generator breakdown:\");\n for (const g of run.generators) {\n logger.info(\n ` ${g.name}: ${g.cardCount} cards (${g.newCount} new, ${g.reviewCount} reviews, top: ${g.topScore.toFixed(2)})`\n );\n }\n console.groupEnd();\n }\n if (run.filters.length > 0) {\n console.group(\"Filter impact:\");\n for (const f of run.filters) {\n logger.info(` ${f.name}: \\u2191${f.boosted} \\u2193${f.penalized} =${f.passed} \\u2715${f.removed}`);\n }\n console.groupEnd();\n }\n logger.info(\n `Result: ${run.finalCount} cards selected (${run.newSelected} new, ${run.reviewsSelected} reviews)`\n );\n console.groupEnd();\n}\nfunction renderUI() {\n if (!_uiContainer) return;\n const runs = runHistory;\n const selectedRun = _selectedRunIndex !== null ? runs[_selectedRunIndex] : null;\n const styles = `\n #sk-pipeline-debugger {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: #f8f9fa;\n color: #212529;\n z-index: 999999;\n display: flex;\n flex-direction: column;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n font-size: 14px;\n }\n #sk-pipeline-debugger header {\n padding: 1rem;\n background: #343a40;\n color: white;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n #sk-pipeline-debugger .container {\n display: flex;\n flex: 1;\n overflow: hidden;\n }\n #sk-pipeline-debugger .sidebar {\n width: 300px;\n border-right: 1px solid #dee2e6;\n overflow-y: auto;\n background: white;\n }\n #sk-pipeline-debugger .main-content {\n flex: 1;\n overflow-y: auto;\n padding: 1.5rem;\n }\n #sk-pipeline-debugger .run-item {\n padding: 0.75rem 1rem;\n border-bottom: 1px solid #eee;\n cursor: pointer;\n }\n #sk-pipeline-debugger .run-item:hover { background: #f1f3f5; }\n #sk-pipeline-debugger .run-item.active { background: #e9ecef; border-left: 4px solid #007bff; }\n #sk-pipeline-debugger h2, #sk-pipeline-debugger h3 { margin-top: 0; }\n #sk-pipeline-debugger table { width: 100%; border-collapse: collapse; margin-bottom: 1rem; background: white; }\n #sk-pipeline-debugger th, #sk-pipeline-debugger td { border: 1px solid #dee2e6; padding: 0.5rem; text-align: left; }\n #sk-pipeline-debugger th { background: #f1f3f5; }\n #sk-pipeline-debugger code { background: #f1f3f5; padding: 0.1rem 0.3rem; border-radius: 3px; font-family: monospace; }\n #sk-pipeline-debugger .close-btn { background: #dc3545; color: white; border: none; padding: 0.5rem 1rem; border-radius: 4px; cursor: pointer; }\n #sk-pipeline-debugger .search-box { margin-bottom: 1rem; width: 100%; padding: 0.5rem; border: 1px solid #ced4da; border-radius: 4px; }\n #sk-pipeline-debugger .provenance { font-size: 12px; color: #666; margin-top: 0.25rem; white-space: pre-wrap; font-family: monospace; background: #f8f9fa; padding: 0.5rem; border-radius: 4px; }\n `;\n const runListHtml = runs.length === 0 ? '<div style=\"padding: 1rem;\">No runs captured yet.</div>' : runs.map(\n (r, i) => `\n <div class=\"run-item ${i === _selectedRunIndex ? \"active\" : \"\"}\" onclick=\"window.skuilder.pipeline._selectRun(${i})\">\n <strong>${r.timestamp.toLocaleTimeString()}</strong><br/>\n <small>${r.courseName || r.courseId.slice(0, 8)}</small><br/>\n <small>${r.finalCount} cards selected</small>\n </div>\n `\n ).join(\"\");\n let detailsHtml = '<div style=\"color: #6c757d; text-align: center; margin-top: 5rem;\">Select a run to see details</div>';\n if (selectedRun) {\n const filteredCards = selectedRun.cards.filter(\n (c) => !_cardSearchQuery || c.cardId.toLowerCase().includes(_cardSearchQuery.toLowerCase())\n );\n detailsHtml = `\n <h2>Run: ${selectedRun.runId}</h2>\n <p>\n <strong>Time:</strong> ${selectedRun.timestamp.toLocaleString()} | \n <strong>Course:</strong> ${selectedRun.courseName || selectedRun.courseId} | \n <strong>User ELO:</strong> ${selectedRun.userElo ?? \"unknown\"}\n </p>\n\n <h3>Pipeline Config</h3>\n <table>\n <tr><th>Generator</th><td>${selectedRun.generatorName} (${selectedRun.generatedCount} candidates)</td></tr>\n ${(selectedRun.generators || []).map(\n (g) => `\n <tr><td style=\"padding-left: 2rem;\">\\u21B3 ${g.name}</td><td>${g.cardCount} cards (${g.newCount} new, ${g.reviewCount} review, top: ${g.topScore.toFixed(2)})</td></tr>\n `\n ).join(\"\")}\n </table>\n\n ${selectedRun.hints ? `\n <h3>Ephemeral Hints</h3>\n <table>\n ${selectedRun.hints._label ? `<tr><th>Label</th><td>${selectedRun.hints._label}</td></tr>` : \"\"}\n ${selectedRun.hints.boostTags ? `<tr><th>Boost Tags</th><td><pre style=\"margin:0\">${JSON.stringify(selectedRun.hints.boostTags, null, 2)}</pre></td></tr>` : \"\"}\n ${selectedRun.hints.boostCards ? `<tr><th>Boost Cards</th><td><pre style=\"margin:0\">${JSON.stringify(selectedRun.hints.boostCards, null, 2)}</pre></td></tr>` : \"\"}\n ${selectedRun.hints.requireTags ? `<tr><th>Require Tags</th><td>${selectedRun.hints.requireTags.join(\", \")}</td></tr>` : \"\"}\n ${selectedRun.hints.requireCards ? `<tr><th>Require Cards</th><td>${selectedRun.hints.requireCards.join(\", \")}</td></tr>` : \"\"}\n ${selectedRun.hints.excludeTags ? `<tr><th>Exclude Tags</th><td>${selectedRun.hints.excludeTags.join(\", \")}</td></tr>` : \"\"}\n ${selectedRun.hints.excludeCards ? `<tr><th>Exclude Cards</th><td>${selectedRun.hints.excludeCards.join(\", \")}</td></tr>` : \"\"}\n </table>\n ` : \"\"}\n\n <h3>Filter Impact</h3>\n <table>\n <thead><tr><th>Filter</th><th>Boosted</th><th>Penalized</th><th>Passed</th><th>Removed</th></tr></thead>\n <tbody>\n ${selectedRun.filters.map(\n (f) => `\n <tr><td>${f.name}</td><td>\\u2191${f.boosted}</td><td>\\u2193${f.penalized}</td><td>=${f.passed}</td><td>\\u2715${f.removed}</td></tr>\n `\n ).join(\"\")}\n </tbody>\n </table>\n\n <h3>Cards (${selectedRun.finalCount} selected / ${selectedRun.cards.length} total)</h3>\n <input type=\"text\" class=\"search-box\" placeholder=\"Search Card ID...\" value=\"${_cardSearchQuery}\" oninput=\"window.skuilder.pipeline._setSearch(this.value)\">\n \n <table>\n <thead><tr><th>ID</th><th>Generator</th><th>Origin</th><th>Score</th><th>Selected</th></tr></thead>\n <tbody>\n ${filteredCards.map(\n (c) => `\n <tr>\n <td><code>${c.cardId}</code></td>\n <td>${c.generator || \"unknown\"}</td>\n <td>${c.origin}</td>\n <td>${c.finalScore.toFixed(3)}</td>\n <td>${c.selected ? \"\\u2705\" : \"\\u274C\"}</td>\n </tr>\n ${c.selected || _cardSearchQuery ? `\n <tr>\n <td colspan=\"5\">\n <div class=\"provenance\">${formatProvenance(c.provenance)}</div>\n </td>\n </tr>\n ` : \"\"}\n `\n ).join(\"\")}\n </tbody>\n </table>\n `;\n }\n _uiContainer.innerHTML = `\n <style>${styles}</style>\n <header>\n <strong>Pipeline Debugger</strong>\n <button class=\"close-btn\" onclick=\"window.skuilder.pipeline.ui()\">Close</button>\n </header>\n <div class=\"container\">\n <div class=\"sidebar\">${runListHtml}</div>\n <div class=\"main-content\">${detailsHtml}</div>\n </div>\n `;\n}\nfunction mountPipelineDebugger() {\n if (typeof window === \"undefined\") return;\n const win = window;\n win.skuilder = win.skuilder || {};\n win.skuilder.pipeline = pipelineDebugAPI;\n}\nvar _activePipeline, MAX_RUNS, runHistory, _uiContainer, _selectedRunIndex, _cardSearchQuery, pipelineDebugAPI;\nvar init_PipelineDebugger = __esm({\n \"src/core/navigators/PipelineDebugger.ts\"() {\n \"use strict\";\n init_navigators();\n init_logger();\n _activePipeline = null;\n MAX_RUNS = 10;\n runHistory = [];\n _uiContainer = null;\n _selectedRunIndex = null;\n _cardSearchQuery = \"\";\n pipelineDebugAPI = {\n /**\n * Get raw run history for programmatic access.\n */\n get runs() {\n return [...runHistory];\n },\n /**\n * Show summary of a specific pipeline run.\n */\n showRun(idOrIndex = 0) {\n if (runHistory.length === 0) {\n logger.info(\"[Pipeline Debug] No runs captured yet.\");\n return;\n }\n let run;\n if (typeof idOrIndex === \"number\") {\n run = runHistory[idOrIndex];\n if (!run) {\n logger.info(\n `[Pipeline Debug] No run found at index ${idOrIndex}. History length: ${runHistory.length}`\n );\n return;\n }\n } else {\n run = runHistory.find((r) => r.runId.endsWith(idOrIndex));\n if (!run) {\n logger.info(`[Pipeline Debug] No run found matching ID '${idOrIndex}'.`);\n return;\n }\n }\n printRunSummary(run);\n },\n /**\n * Show summary of the last pipeline run.\n */\n showLastRun() {\n this.showRun(0);\n },\n /**\n * Show detailed provenance for a specific card.\n */\n showCard(cardId) {\n for (const run of runHistory) {\n const card = run.cards.find((c) => c.cardId === cardId);\n if (card) {\n console.group(`\\u{1F3B4} Card: ${cardId}`);\n logger.info(`Course: ${card.courseId}`);\n logger.info(`Origin: ${card.origin}`);\n logger.info(`Card ELO: ${card.cardElo ?? \"unknown\"} | User ELO: ${run.userElo ?? \"unknown\"}`);\n logger.info(`Final score: ${card.finalScore.toFixed(3)}`);\n logger.info(`Selected: ${card.selected ? \"Yes \\u2705\" : \"No \\u274C\"}`);\n if (card.tags && card.tags.length > 0) {\n logger.info(`Tags (${card.tags.length}): ${card.tags.join(\", \")}`);\n }\n logger.info(\"Provenance:\");\n logger.info(formatProvenance(card.provenance));\n console.groupEnd();\n return;\n }\n }\n logger.info(`[Pipeline Debug] Card '${cardId}' not found in recent runs.`);\n },\n /**\n * Explain why reviews may or may not have been selected.\n */\n explainReviews() {\n if (runHistory.length === 0) {\n logger.info(\"[Pipeline Debug] No runs captured yet.\");\n return;\n }\n console.group(\"\\u{1F4CB} Review Selection Analysis\");\n for (const run of runHistory) {\n console.group(`Run: ${run.courseId} @ ${run.timestamp.toLocaleTimeString()}`);\n const allReviews = run.cards.filter((c) => c.origin === \"review\");\n const selectedReviews = allReviews.filter((c) => c.selected);\n if (allReviews.length === 0) {\n logger.info(\"\\u274C No reviews were generated. Check SRS logs for why.\");\n } else if (selectedReviews.length === 0) {\n logger.info(`\\u26A0\\uFE0F ${allReviews.length} reviews generated but none selected.`);\n logger.info(\"Possible reasons:\");\n const topNewScore = Math.max(\n ...run.cards.filter((c) => c.origin === \"new\" && c.selected).map((c) => c.finalScore),\n 0\n );\n const topReviewScore = Math.max(...allReviews.map((c) => c.finalScore), 0);\n if (topReviewScore < topNewScore) {\n logger.info(\n ` - New cards scored higher (top new: ${topNewScore.toFixed(2)}, top review: ${topReviewScore.toFixed(2)})`\n );\n }\n const topReview = allReviews.sort((a, b) => b.finalScore - a.finalScore)[0];\n if (topReview) {\n logger.info(` - Top review score: ${topReview.finalScore.toFixed(3)}`);\n logger.info(\" - Its provenance:\");\n logger.info(formatProvenance(topReview.provenance));\n }\n } else {\n logger.info(`\\u2705 ${selectedReviews.length}/${allReviews.length} reviews selected.`);\n logger.info(\"Top selected review:\");\n const topSelected = selectedReviews.sort((a, b) => b.finalScore - a.finalScore)[0];\n logger.info(formatProvenance(topSelected.provenance));\n }\n console.groupEnd();\n }\n console.groupEnd();\n },\n /**\n * Show prescribed-related cards from the most recent run.\n *\n * Highlights:\n * - cards directly generated by the prescribed strategy\n * - blocked prescribed targets mentioned in provenance\n * - support tags resolved for blocked targets\n *\n * @param groupId - Optional prescribed group ID filter (e.g. 'intro-core')\n */\n showPrescribed(groupId) {\n if (runHistory.length === 0) {\n logger.info(\"[Pipeline Debug] No runs captured yet.\");\n return;\n }\n const run = runHistory[0];\n const prescribedCards = run.cards.filter(\n (c) => c.provenance.some((p) => p.strategy === \"prescribed\")\n );\n console.group(`\\u{1F9ED} Prescribed Debug (${run.courseId})`);\n if (prescribedCards.length === 0) {\n logger.info(\"No prescribed-generated cards were present in the most recent run.\");\n console.groupEnd();\n return;\n }\n const rows = prescribedCards.map((card) => {\n const prescribedProv = card.provenance.find((p) => p.strategy === \"prescribed\");\n const reason = prescribedProv?.reason ?? \"\";\n const parsedGroup = reason.match(/group=([^;]+)/)?.[1] ?? \"unknown\";\n const mode = reason.match(/mode=([^;]+)/)?.[1] ?? \"unknown\";\n const blocked = reason.match(/blocked=([^;]+)/)?.[1] ?? \"unknown\";\n const blockedTargets = reason.match(/blockedTargets=([^;]+)/)?.[1] ?? \"none\";\n const supportCard = reason.match(/supportCard=([^;]+)/)?.[1] ?? \"none\";\n const supportTags = reason.match(/supportTags=([^;]+)/)?.[1] ?? \"none\";\n const multiplier = reason.match(/multiplier=([^;]+)/)?.[1] ?? \"unknown\";\n const supportSource = mode === \"discovered-support\" ? \"discovered\" : mode === \"support\" ? \"authored\" : \"n/a\";\n return {\n group: parsedGroup,\n mode,\n supportSource,\n cardId: card.cardId,\n selected: card.selected ? \"yes\" : \"no\",\n finalScore: card.finalScore.toFixed(3),\n blocked,\n blockedTargets,\n supportCard,\n supportTags,\n multiplier\n };\n }).filter((row) => !groupId || row.group === groupId).sort((a, b) => Number(b.finalScore) - Number(a.finalScore));\n if (rows.length === 0) {\n logger.info(\n `[Pipeline Debug] No prescribed cards matched group '${groupId}' in the most recent run.`\n );\n console.groupEnd();\n return;\n }\n console.table(rows);\n const selectedRows = rows.filter((r) => r.selected === \"yes\");\n const blockedTargetSet = /* @__PURE__ */ new Set();\n const supportTagSet = /* @__PURE__ */ new Set();\n const authoredSupportSet = /* @__PURE__ */ new Set();\n const discoveredSupportSet = /* @__PURE__ */ new Set();\n for (const row of rows) {\n if (row.blockedTargets && row.blockedTargets !== \"none\") {\n row.blockedTargets.split(\"|\").filter(Boolean).forEach((t) => blockedTargetSet.add(t));\n }\n if (row.supportTags && row.supportTags !== \"none\") {\n row.supportTags.split(\"|\").filter(Boolean).forEach((t) => supportTagSet.add(t));\n }\n if (row.supportCard && row.supportCard !== \"none\") {\n if (row.supportSource === \"discovered\") {\n discoveredSupportSet.add(row.supportCard);\n } else if (row.supportSource === \"authored\") {\n authoredSupportSet.add(row.supportCard);\n }\n }\n }\n logger.info(`Prescribed cards in run: ${rows.length}`);\n logger.info(`Selected prescribed cards: ${selectedRows.length}`);\n logger.info(\n `Blocked prescribed targets referenced: ${blockedTargetSet.size > 0 ? [...blockedTargetSet].join(\", \") : \"none\"}`\n );\n logger.info(\n `Resolved support tags referenced: ${supportTagSet.size > 0 ? [...supportTagSet].join(\", \") : \"none\"}`\n );\n logger.info(\n `Authored support cards emitted: ${authoredSupportSet.size > 0 ? [...authoredSupportSet].join(\", \") : \"none\"}`\n );\n logger.info(\n `Discovered support cards emitted: ${discoveredSupportSet.size > 0 ? [...discoveredSupportSet].join(\", \") : \"none\"}`\n );\n console.groupEnd();\n },\n /**\n * Show all runs in compact format.\n */\n listRuns() {\n if (runHistory.length === 0) {\n logger.info(\"[Pipeline Debug] No runs captured yet.\");\n return;\n }\n console.table(\n runHistory.map((r) => ({\n id: r.runId.slice(-8),\n time: r.timestamp.toLocaleTimeString(),\n course: r.courseName || r.courseId.slice(0, 8),\n generated: r.generatedCount,\n selected: r.finalCount,\n new: r.newSelected,\n reviews: r.reviewsSelected\n }))\n );\n },\n /**\n * Export run history as JSON for bug reports.\n */\n export() {\n const json = JSON.stringify(runHistory, null, 2);\n logger.info(\"[Pipeline Debug] Run history exported. Copy the returned string or use:\");\n logger.info(\" copy(window.skuilder.pipeline.export())\");\n return json;\n },\n /**\n * Clear run history.\n */\n clear() {\n runHistory.length = 0;\n logger.info(\"[Pipeline Debug] Run history cleared.\");\n },\n /**\n * Show the navigator registry: all registered classes and their roles.\n *\n * Useful for verifying that consumer-defined navigators were registered\n * before pipeline assembly.\n */\n showRegistry() {\n const names = getRegisteredNavigatorNames();\n if (names.length === 0) {\n logger.info(\"[Pipeline Debug] Navigator registry is empty.\");\n return;\n }\n console.group(\"\\u{1F4E6} Navigator Registry\");\n console.table(\n names.map((name) => {\n const registryRole = getRegisteredNavigatorRole(name);\n const builtinRole = NavigatorRoles[name];\n const effectiveRole = builtinRole || registryRole || \"\\u26A0\\uFE0F NONE\";\n const source = builtinRole ? \"built-in\" : registryRole ? \"consumer\" : \"unclassified\";\n return {\n name,\n role: effectiveRole,\n source,\n isGenerator: isGenerator(name),\n isFilter: isFilter(name)\n };\n })\n );\n console.groupEnd();\n },\n /**\n * Show strategy documents from the last pipeline run and how they mapped\n * to the registry.\n *\n * If no runs are captured yet, falls back to showing just the registry.\n */\n showStrategies() {\n this.showRegistry();\n if (runHistory.length === 0) {\n logger.info(\"[Pipeline Debug] No pipeline runs captured yet \\u2014 cannot show strategy doc mapping.\");\n return;\n }\n const run = runHistory[0];\n console.group(\"\\u{1F50C} Pipeline Strategy Mapping (last run)\");\n logger.info(`Generator: ${run.generatorName}`);\n if (run.generators && run.generators.length > 0) {\n for (const g of run.generators) {\n logger.info(` \\u{1F4E5} ${g.name}: ${g.cardCount} cards (${g.newCount} new, ${g.reviewCount} reviews)`);\n }\n }\n if (run.filters.length > 0) {\n logger.info(\"Filters:\");\n for (const f of run.filters) {\n logger.info(` \\u{1F538} ${f.name}: \\u2191${f.boosted} \\u2193${f.penalized} =${f.passed} \\u2715${f.removed}`);\n }\n } else {\n logger.info(\"Filters: (none)\");\n }\n console.groupEnd();\n },\n /**\n * Scan the full card space through the filter chain for the current user.\n *\n * Reports how many cards are well-indicated and how many are new.\n * Use this to understand how the search space grows during onboarding.\n *\n * @param threshold - Score threshold for \"well indicated\" (default 0.10)\n */\n async diagnoseCardSpace(threshold) {\n if (!_activePipeline) {\n logger.info(\"[Pipeline Debug] No active pipeline. Run a session first.\");\n return null;\n }\n return _activePipeline.diagnoseCardSpace({ threshold });\n },\n /**\n * Show user's per-tag ELO data. Useful for diagnosing hierarchy gate status.\n *\n * @param tagFilter - Optional glob pattern(s) to filter tags.\n * Examples: 'gpc:expose:*', 'gpc:intro:t-T', ['gpc:expose:t-*', 'gpc:intro:t-*']\n */\n async showTagElo(tagFilter) {\n if (!_activePipeline) {\n logger.info(\"[Pipeline Debug] No active pipeline. Run a session first.\");\n return;\n }\n const status = await _activePipeline.getTagEloStatus(tagFilter);\n const entries = Object.entries(status).sort(([a], [b]) => a.localeCompare(b));\n if (entries.length === 0) {\n logger.info(`[Pipeline Debug] No tag ELO data found${tagFilter ? ` for pattern: ${tagFilter}` : \"\"}.`);\n return;\n }\n console.table(\n Object.fromEntries(entries.map(([tag, data]) => [tag, { score: Math.round(data.score), count: data.count }]))\n );\n },\n /**\n * Toggle the full-screen UI debugger.\n */\n ui() {\n if (_uiContainer) {\n document.body.removeChild(_uiContainer);\n _uiContainer = null;\n return;\n }\n _uiContainer = document.createElement(\"div\");\n _uiContainer.id = \"sk-pipeline-debugger\";\n document.body.appendChild(_uiContainer);\n if (_selectedRunIndex === null && runHistory.length > 0) {\n _selectedRunIndex = 0;\n }\n renderUI();\n },\n /**\n * Internal UI helpers\n * @internal\n */\n _selectRun(index) {\n _selectedRunIndex = index;\n renderUI();\n },\n /**\n * Internal UI helpers\n * @internal\n */\n _setSearch(query) {\n _cardSearchQuery = query;\n renderUI();\n },\n /**\n * Show help.\n */\n help() {\n logger.info(`\n\\u{1F527} Pipeline Debug API\n\nCommands:\n .ui() Toggle full-screen UI debugger\n .showLastRun() Show summary of most recent pipeline run\n .showRun(id|index) Show summary of a specific run (by index or ID suffix)\n .showCard(cardId) Show provenance trail for a specific card\n .showTagElo(pattern) Show user's tag ELO data (async). E.g. 'gpc:expose:*'\n .explainReviews() Analyze why reviews were/weren't selected\n .diagnoseCardSpace() Scan full card space through filters (async)\n .showRegistry() Show navigator registry (classes + roles)\n .showStrategies() Show registry + strategy mapping from last run\n .showPrescribed(id?) Show prescribed-generated cards and blocked/support details from last run\n .listRuns() List all captured runs in table format\n .export() Export run history as JSON for bug reports\n .clear() Clear run history\n .runs Access raw run history array\n .help() Show this help message\n\nExample:\n window.skuilder.pipeline.ui()\n window.skuilder.pipeline.showLastRun()\n window.skuilder.pipeline.showRun(1)\n await window.skuilder.pipeline.diagnoseCardSpace()\n`);\n }\n };\n mountPipelineDebugger();\n }\n});\n\n// src/core/navigators/generators/CompositeGenerator.ts\nvar CompositeGenerator_exports = {};\n__export(CompositeGenerator_exports, {\n AggregationMode: () => AggregationMode,\n default: () => CompositeGenerator\n});\nfunction mergeHints(allHints) {\n const defined = allHints.filter((h) => h !== void 0);\n if (defined.length === 0) return void 0;\n const merged = {};\n const boostTags = {};\n for (const hints of defined) {\n for (const [pattern, factor] of Object.entries(hints.boostTags ?? {})) {\n boostTags[pattern] = (boostTags[pattern] ?? 1) * factor;\n }\n }\n if (Object.keys(boostTags).length > 0) {\n merged.boostTags = boostTags;\n }\n const boostCards = {};\n for (const hints of defined) {\n for (const [pattern, factor] of Object.entries(hints.boostCards ?? {})) {\n boostCards[pattern] = (boostCards[pattern] ?? 1) * factor;\n }\n }\n if (Object.keys(boostCards).length > 0) {\n merged.boostCards = boostCards;\n }\n const concatUnique = (field) => {\n const values = defined.flatMap((h) => h[field] ?? []);\n if (values.length > 0) {\n merged[field] = [...new Set(values)];\n }\n };\n concatUnique(\"requireTags\");\n concatUnique(\"requireCards\");\n concatUnique(\"excludeTags\");\n concatUnique(\"excludeCards\");\n const labels = defined.map((h) => h._label).filter(Boolean);\n if (labels.length > 0) {\n merged._label = labels.join(\"; \");\n }\n return Object.keys(merged).length > 0 ? merged : void 0;\n}\nvar AggregationMode, DEFAULT_AGGREGATION_MODE, FREQUENCY_BOOST_FACTOR, CompositeGenerator;\nvar init_CompositeGenerator = __esm({\n \"src/core/navigators/generators/CompositeGenerator.ts\"() {\n \"use strict\";\n init_navigators();\n init_logger();\n AggregationMode = /* @__PURE__ */ ((AggregationMode2) => {\n AggregationMode2[\"MAX\"] = \"max\";\n AggregationMode2[\"AVERAGE\"] = \"average\";\n AggregationMode2[\"FREQUENCY_BOOST\"] = \"frequencyBoost\";\n return AggregationMode2;\n })(AggregationMode || {});\n DEFAULT_AGGREGATION_MODE = \"frequencyBoost\" /* FREQUENCY_BOOST */;\n FREQUENCY_BOOST_FACTOR = 0.1;\n CompositeGenerator = class _CompositeGenerator extends ContentNavigator {\n /** Human-readable name for CardGenerator interface */\n name = \"Composite Generator\";\n generators;\n aggregationMode;\n constructor(generators, aggregationMode = DEFAULT_AGGREGATION_MODE) {\n super();\n this.generators = generators;\n this.aggregationMode = aggregationMode;\n if (generators.length === 0) {\n throw new Error(\"CompositeGenerator requires at least one generator\");\n }\n logger.debug(\n `[CompositeGenerator] Created with ${generators.length} generators, mode: ${aggregationMode}`\n );\n }\n /**\n * Creates a CompositeGenerator from strategy data.\n *\n * This is a convenience factory for use by PipelineAssembler.\n */\n static async fromStrategies(user, course, strategies, aggregationMode = DEFAULT_AGGREGATION_MODE) {\n const generators = await Promise.all(\n strategies.map((s) => ContentNavigator.create(user, course, s))\n );\n return new _CompositeGenerator(generators, aggregationMode);\n }\n /**\n * Get weighted cards from all generators, merge and deduplicate.\n *\n * Cards appearing in multiple generators receive a score boost.\n * Provenance tracks which generators produced each card and how scores were aggregated.\n *\n * This method supports both the legacy signature (limit only) and the\n * CardGenerator interface signature (limit, context).\n *\n * @param limit - Maximum number of cards to return\n * @param context - GeneratorContext passed to child generators (required when called via Pipeline)\n */\n async getWeightedCards(limit, context) {\n if (!context) {\n throw new Error(\n \"CompositeGenerator.getWeightedCards requires a GeneratorContext. It should be called via Pipeline, not directly.\"\n );\n }\n const results = await Promise.all(\n this.generators.map((g) => g.getWeightedCards(limit, context))\n );\n const generatorSummaries = [];\n results.forEach((result, index) => {\n const cards2 = result.cards;\n const gen = this.generators[index];\n const genName = gen.name || `Generator ${index}`;\n const newCards = cards2.filter((c) => c.provenance[0]?.reason?.includes(\"new card\"));\n const reviewCards = cards2.filter((c) => c.provenance[0]?.reason?.includes(\"review\"));\n if (cards2.length > 0) {\n const topScore = Math.max(...cards2.map((c) => c.score)).toFixed(2);\n const parts = [];\n if (newCards.length > 0) parts.push(`${newCards.length} new`);\n if (reviewCards.length > 0) parts.push(`${reviewCards.length} reviews`);\n const breakdown = parts.length > 0 ? parts.join(\", \") : `${cards2.length} cards`;\n generatorSummaries.push(`${genName}: ${breakdown} (top: ${topScore})`);\n } else {\n generatorSummaries.push(`${genName}: 0 cards`);\n }\n });\n logger.info(`[Composite] Generator breakdown: ${generatorSummaries.join(\" | \")}`);\n const byCardId = /* @__PURE__ */ new Map();\n results.forEach((result, index) => {\n const cards2 = result.cards;\n const gen = this.generators[index];\n let weight = gen.learnable?.weight ?? 1;\n let deviation;\n if (gen.learnable && !gen.staticWeight && context.orchestration) {\n const strategyId = gen.strategyId;\n if (strategyId) {\n weight = context.orchestration.getEffectiveWeight(strategyId, gen.learnable);\n deviation = context.orchestration.getDeviation(strategyId);\n }\n }\n for (const card of cards2) {\n if (card.provenance.length > 0) {\n card.provenance[0].effectiveWeight = weight;\n card.provenance[0].deviation = deviation;\n }\n const existing = byCardId.get(card.cardId) || [];\n existing.push({ card, weight });\n byCardId.set(card.cardId, existing);\n }\n });\n const merged = [];\n for (const [, items] of byCardId) {\n const cards2 = items.map((i) => i.card);\n const aggregatedScore = this.aggregateScores(items);\n const finalScore = Math.max(0, aggregatedScore);\n const mergedProvenance = cards2.flatMap((c) => c.provenance);\n const initialScore = cards2[0].score;\n const action = finalScore > initialScore ? \"boosted\" : finalScore < initialScore ? \"penalized\" : \"passed\";\n const reason = this.buildAggregationReason(items, finalScore);\n merged.push({\n ...cards2[0],\n score: finalScore,\n provenance: [\n ...mergedProvenance,\n {\n strategy: \"composite\",\n strategyName: \"Composite Generator\",\n strategyId: \"COMPOSITE_GENERATOR\",\n action,\n score: finalScore,\n reason\n }\n ]\n });\n }\n const cards = merged.sort((a, b) => b.score - a.score).slice(0, limit);\n const hints = mergeHints(results.map((result) => result.hints));\n return { cards, hints };\n }\n /**\n * Build human-readable reason for score aggregation.\n */\n buildAggregationReason(items, finalScore) {\n const cards = items.map((i) => i.card);\n const count = cards.length;\n const scores = cards.map((c) => c.score.toFixed(2)).join(\", \");\n if (count === 1) {\n const weightMsg = Math.abs(items[0].weight - 1) > 1e-3 ? ` (w=${items[0].weight.toFixed(2)})` : \"\";\n return `Single generator, score ${finalScore.toFixed(2)}${weightMsg}`;\n }\n const strategies = cards.map((c) => c.provenance[0]?.strategy || \"unknown\").join(\", \");\n switch (this.aggregationMode) {\n case \"max\" /* MAX */:\n return `Max of ${count} generators (${strategies}): scores [${scores}] \\u2192 ${finalScore.toFixed(2)}`;\n case \"average\" /* AVERAGE */:\n return `Weighted Avg of ${count} generators (${strategies}): scores [${scores}] \\u2192 ${finalScore.toFixed(2)}`;\n case \"frequencyBoost\" /* FREQUENCY_BOOST */: {\n const totalWeight = items.reduce((sum, i) => sum + i.weight, 0);\n const weightedSum = items.reduce((sum, i) => sum + i.card.score * i.weight, 0);\n const avg = totalWeight > 0 ? weightedSum / totalWeight : 0;\n const boost = 1 + FREQUENCY_BOOST_FACTOR * (count - 1);\n return `Frequency boost from ${count} generators (${strategies}): w-avg ${avg.toFixed(2)} \\xD7 ${boost.toFixed(2)} \\u2192 ${finalScore.toFixed(2)}`;\n }\n default:\n return `Aggregated from ${count} generators: ${finalScore.toFixed(2)}`;\n }\n }\n /**\n * Aggregate scores from multiple generators for the same card.\n */\n aggregateScores(items) {\n const scores = items.map((i) => i.card.score);\n switch (this.aggregationMode) {\n case \"max\" /* MAX */:\n return Math.max(...scores);\n case \"average\" /* AVERAGE */: {\n const totalWeight = items.reduce((sum, i) => sum + i.weight, 0);\n if (totalWeight === 0) return 0;\n const weightedSum = items.reduce((sum, i) => sum + i.card.score * i.weight, 0);\n return weightedSum / totalWeight;\n }\n case \"frequencyBoost\" /* FREQUENCY_BOOST */: {\n const totalWeight = items.reduce((sum, i) => sum + i.weight, 0);\n const weightedSum = items.reduce((sum, i) => sum + i.card.score * i.weight, 0);\n const avg = totalWeight > 0 ? weightedSum / totalWeight : 0;\n const frequencyBoost = 1 + FREQUENCY_BOOST_FACTOR * (items.length - 1);\n return avg * frequencyBoost;\n }\n default:\n return scores[0];\n }\n }\n };\n }\n});\n\n// src/core/navigators/generators/elo.ts\nvar elo_exports = {};\n__export(elo_exports, {\n default: () => ELONavigator\n});\nimport { toCourseElo as toCourseElo2 } from \"@vue-skuilder/common\";\nvar ELONavigator;\nvar init_elo = __esm({\n \"src/core/navigators/generators/elo.ts\"() {\n \"use strict\";\n init_navigators();\n init_logger();\n ELONavigator = class extends ContentNavigator {\n /** Human-readable name for CardGenerator interface */\n name;\n constructor(user, course, strategyData) {\n super(user, course, strategyData);\n this.name = strategyData?.name || \"ELO\";\n }\n /**\n * Get new cards with suitability scores based on ELO distance.\n *\n * Cards closer to user's ELO get higher scores.\n * Score formula: max(0, 1 - distance / 500)\n *\n * NOTE: This generator only handles NEW cards. Reviews are handled by\n * SRSNavigator. Use CompositeGenerator to combine both.\n *\n * This method supports both the legacy signature (limit only) and the\n * CardGenerator interface signature (limit, context).\n *\n * @param limit - Maximum number of cards to return\n * @param context - Optional GeneratorContext (used when called via Pipeline)\n */\n async getWeightedCards(limit, context) {\n let userGlobalElo;\n if (context?.userElo !== void 0) {\n userGlobalElo = context.userElo;\n } else {\n const courseReg = await this.user.getCourseRegDoc(this.course.getCourseID());\n const userElo = toCourseElo2(courseReg.elo);\n userGlobalElo = userElo.global.score;\n }\n const activeCards = await this.user.getActiveCards();\n const newCards = (await this.course.getCardsCenteredAtELO(\n { limit, elo: \"user\" },\n (c) => !activeCards.some((ac) => c.cardID === ac.cardID)\n )).map((c) => ({ ...c, status: \"new\" }));\n const cardIds = newCards.map((c) => c.cardID);\n const cardEloData = await this.course.getCardEloData(cardIds);\n const scored = newCards.map((c, i) => {\n const cardElo = cardEloData[i]?.global?.score ?? 1e3;\n const distance = Math.abs(cardElo - userGlobalElo);\n const rawScore = Math.max(0, 1 - distance / 500);\n const samplingKey = rawScore > 0 ? Math.random() ** (1 / rawScore) : 0;\n return {\n cardId: c.cardID,\n courseId: c.courseID,\n score: samplingKey,\n provenance: [\n {\n strategy: \"elo\",\n strategyName: this.strategyName || this.name,\n strategyId: this.strategyId || \"NAVIGATION_STRATEGY-ELO-default\",\n action: \"generated\",\n score: samplingKey,\n reason: `ELO distance ${Math.round(distance)} (card: ${Math.round(cardElo)}, user: ${Math.round(userGlobalElo)}), raw ${rawScore.toFixed(3)}, key ${samplingKey.toFixed(3)}`\n }\n ]\n };\n });\n scored.sort((a, b) => b.score - a.score);\n const cards = scored.slice(0, limit);\n if (cards.length > 0) {\n const topScores = cards.slice(0, 3).map((c) => c.score.toFixed(2)).join(\", \");\n logger.info(\n `[ELO] Course ${this.course.getCourseID()}: ${cards.length} new cards (top scores: ${topScores})`\n );\n } else {\n logger.info(`[ELO] Course ${this.course.getCourseID()}: No new cards available`);\n }\n return { cards };\n }\n };\n }\n});\n\n// src/core/navigators/generators/index.ts\nvar generators_exports = {};\nvar init_generators = __esm({\n \"src/core/navigators/generators/index.ts\"() {\n \"use strict\";\n }\n});\n\n// src/core/navigators/generators/prescribed.ts\nvar prescribed_exports = {};\n__export(prescribed_exports, {\n default: () => PrescribedCardsGenerator\n});\nfunction dedupe(arr) {\n return [...new Set(arr)];\n}\nfunction isoNow() {\n return (/* @__PURE__ */ new Date()).toISOString();\n}\nfunction clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\nfunction matchesTagPattern(tag, pattern) {\n if (pattern === \"*\") return true;\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n const re = new RegExp(`^${escaped}$`);\n return re.test(tag);\n}\nfunction extractWordStem(cardId) {\n for (const prefix of [\"c-ml-\", \"c-ws-\", \"c-spelling-\"]) {\n if (cardId.startsWith(prefix)) {\n const rest = cardId.slice(prefix.length);\n const lastDash = rest.lastIndexOf(\"-\");\n return lastDash > 0 ? rest.slice(0, lastDash) : rest;\n }\n }\n return cardId;\n}\nfunction shuffleInPlace(arr) {\n for (let i = arr.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [arr[i], arr[j]] = [arr[j], arr[i]];\n }\n}\nfunction pickTopByScore(cards, limit) {\n return [...cards].sort((a, b) => b.score - a.score || a.cardId.localeCompare(b.cardId)).slice(0, limit);\n}\nvar DEFAULT_FRESHNESS_WINDOW, DEFAULT_MAX_DIRECT_PER_RUN, DEFAULT_MAX_SUPPORT_PER_RUN, DEFAULT_HIERARCHY_DEPTH, DEFAULT_MIN_COUNT, BASE_TARGET_SCORE, BASE_SUPPORT_SCORE, DISCOVERED_SUPPORT_SCORE, MAX_TARGET_MULTIPLIER, MAX_SUPPORT_MULTIPLIER, PRESCRIBED_DEBUG_VERSION, PrescribedCardsGenerator;\nvar init_prescribed = __esm({\n \"src/core/navigators/generators/prescribed.ts\"() {\n \"use strict\";\n init_navigators();\n init_logger();\n DEFAULT_FRESHNESS_WINDOW = 3;\n DEFAULT_MAX_DIRECT_PER_RUN = 3;\n DEFAULT_MAX_SUPPORT_PER_RUN = 3;\n DEFAULT_HIERARCHY_DEPTH = 2;\n DEFAULT_MIN_COUNT = 3;\n BASE_TARGET_SCORE = 1;\n BASE_SUPPORT_SCORE = 0.8;\n DISCOVERED_SUPPORT_SCORE = 12;\n MAX_TARGET_MULTIPLIER = 8;\n MAX_SUPPORT_MULTIPLIER = 4;\n PRESCRIBED_DEBUG_VERSION = \"testversion-prescribed-v3\";\n PrescribedCardsGenerator = class extends ContentNavigator {\n name;\n config;\n constructor(user, course, strategyData) {\n super(user, course, strategyData);\n this.name = strategyData.name || \"Prescribed Cards\";\n this.config = this.parseConfig(strategyData.serializedData);\n logger.debug(\n `[Prescribed] Initialized with ${this.config.groups.length} groups and ${this.config.groups.reduce((n, g) => n + g.targetCardIds.length, 0)} targets`\n );\n }\n get strategyKey() {\n return \"PrescribedProgress\";\n }\n async getWeightedCards(limit, context) {\n if (this.config.groups.length === 0 || limit <= 0) {\n return { cards: [] };\n }\n const courseId = this.course.getCourseID();\n const activeCards = await this.user.getActiveCards();\n const activeIds = new Set(activeCards.map((ac) => ac.cardID));\n const seenCards = await this.user.getSeenCards(courseId).catch(() => []);\n const seenIds = new Set(seenCards);\n const progress = await this.getStrategyState() ?? {\n updatedAt: isoNow(),\n groups: {}\n };\n const hierarchyConfigs = await this.loadHierarchyConfigs();\n const courseReg = await this.user.getCourseRegDoc(courseId).catch(() => null);\n const userGlobalElo = typeof courseReg?.elo === \"number\" ? courseReg.elo : courseReg?.elo?.global?.score ?? context?.userElo ?? 1e3;\n const userTagElo = typeof courseReg?.elo === \"number\" ? {} : courseReg?.elo?.tags ?? {};\n const allTargetIds = dedupe(this.config.groups.flatMap((g) => g.targetCardIds));\n const allSupportIds = dedupe(this.config.groups.flatMap((g) => g.supportCardIds ?? []));\n const allRelevantIds = dedupe([...allTargetIds, ...allSupportIds]);\n const tagsByCard = allRelevantIds.length > 0 ? await this.course.getAppliedTagsBatch(allRelevantIds) : /* @__PURE__ */ new Map();\n const courseTagDocs = await this.course.getCourseTagStubs().catch(\n () => ({\n rows: [],\n offset: 0,\n total_rows: 0\n })\n );\n const cardsByTag = /* @__PURE__ */ new Map();\n for (const row of courseTagDocs.rows ?? []) {\n const tagDoc = row.doc;\n if (tagDoc?.name && Array.isArray(tagDoc.taggedCards)) {\n cardsByTag.set(tagDoc.name, [...tagDoc.taggedCards]);\n }\n }\n const nextState = {\n updatedAt: isoNow(),\n groups: {}\n };\n const emitted = [];\n const emittedIds = /* @__PURE__ */ new Set();\n const groupRuntimes = [];\n for (const group of this.config.groups) {\n const runtime = this.buildGroupRuntimeState({\n group,\n priorState: progress.groups[group.id],\n activeIds,\n seenIds,\n tagsByCard,\n cardsByTag,\n hierarchyConfigs,\n userTagElo,\n userGlobalElo\n });\n groupRuntimes.push(runtime);\n logger.info(\n `[Prescribed] Group '${group.id}': ${group.targetCardIds.length} targets total, ${runtime.encounteredTargets.size} encountered, ${runtime.pendingTargets.length} pending (${runtime.surfaceableTargets.length} surfaceable, ${runtime.blockedTargets.length} blocked), ${runtime.supportCandidates.length} authored support candidates, ${runtime.discoveredSupportCandidates.length} discovered support candidates, pressure=${runtime.pressureMultiplier.toFixed(2)}`\n );\n if (runtime.blockedTargets.length > 0) {\n logger.info(\n `[Prescribed] Group '${group.id}' blocked targets: ${runtime.blockedTargets.join(\", \")}`\n );\n logger.info(\n `[Prescribed] Group '${group.id}' support tags needed: ${runtime.supportTags.join(\", \") || \"(none)\"}`\n );\n logger.info(\n `[Prescribed] Group '${group.id}' escalation mode: ` + (runtime.supportCandidates.length > 0 ? \"direct-support\" : runtime.discoveredSupportCandidates.length > 0 ? \"inserted-support-candidates\" : \"boost-only\")\n );\n if (runtime.discoveredSupportCandidates.length > 0) {\n logger.info(\n `[Prescribed] Group '${group.id}' discovered support candidates: ${runtime.discoveredSupportCandidates.join(\", \")}`\n );\n }\n }\n nextState.groups[group.id] = this.buildNextGroupState(runtime, progress.groups[group.id]);\n const directCards = this.buildDirectTargetCards(\n runtime,\n courseId,\n emittedIds\n );\n const supportCards = this.buildSupportCards(\n runtime,\n courseId,\n emittedIds\n );\n const discoveredSupportCards = this.buildDiscoveredSupportCards(\n runtime,\n courseId,\n emittedIds\n );\n emitted.push(...directCards, ...supportCards, ...discoveredSupportCards);\n }\n const hintSummary = this.buildSupportHintSummary(groupRuntimes);\n const hints = Object.keys(hintSummary.boostTags).length > 0 ? {\n boostTags: hintSummary.boostTags,\n _label: `prescribed-support (${hintSummary.supportTags.length} tags; blocked=${hintSummary.blockedTargetIds.length}; testversion=${PRESCRIBED_DEBUG_VERSION})`\n } : void 0;\n if (hints) {\n const tagEntries = Object.entries(hints.boostTags ?? {});\n logger.info(\n `[Prescribed] Emitting ${tagEntries.length} boost hint(s): ` + tagEntries.map(([tag, mult]) => `${tag}\\xD7${mult.toFixed(1)}`).join(\", \")\n );\n } else {\n logger.info(\"[Prescribed] No hints to emit (no blocked targets or no support tags)\");\n }\n if (emitted.length === 0) {\n logger.info(\n \"[Prescribed] 0 cards emitted (all targets blocked, authored/discovered support candidates exhausted)\" + (hints ? \" \\u2014 boost hints emitted but may not survive filters\" : \"\")\n );\n await this.putStrategyState(nextState).catch((e) => {\n logger.debug(`[Prescribed] Failed to persist empty-state update: ${e}`);\n });\n return hints ? { cards: [], hints } : { cards: [] };\n }\n const finalCards = pickTopByScore(emitted, limit);\n const surfacedByGroup = /* @__PURE__ */ new Map();\n for (const card of finalCards) {\n const prov = card.provenance[0];\n const groupId = prov?.reason.match(/group=([^;]+)/)?.[1];\n const mode = prov?.reason.includes(\"mode=support\") ? \"supportIds\" : \"targetIds\";\n if (!groupId) continue;\n if (!surfacedByGroup.has(groupId)) {\n surfacedByGroup.set(groupId, { targetIds: [], supportIds: [] });\n }\n surfacedByGroup.get(groupId)[mode].push(card.cardId);\n }\n for (const group of this.config.groups) {\n const groupState = nextState.groups[group.id];\n const surfaced = surfacedByGroup.get(group.id);\n if (surfaced && (surfaced.targetIds.length > 0 || surfaced.supportIds.length > 0)) {\n groupState.lastSurfacedAt = isoNow();\n groupState.sessionsSinceSurfaced = 0;\n if (surfaced.supportIds.length > 0) {\n groupState.lastSupportAt = isoNow();\n }\n }\n }\n await this.putStrategyState(nextState).catch((e) => {\n logger.debug(`[Prescribed] Failed to persist prescribed progress: ${e}`);\n });\n logger.info(\n `[Prescribed] Emitting ${finalCards.length} cards (${finalCards.filter((c) => c.provenance[0]?.reason.includes(\"mode=target\")).length} target, ${finalCards.filter((c) => c.provenance[0]?.reason.includes(\"mode=support\")).length} support, ${finalCards.filter((c) => c.provenance[0]?.reason.includes(\"mode=discovered-support\")).length} discovered support)`\n );\n return hints ? { cards: finalCards, hints } : { cards: finalCards };\n }\n buildSupportHintSummary(groupRuntimes) {\n const boostTags = {};\n const blockedTargetIds = /* @__PURE__ */ new Set();\n const supportTags = /* @__PURE__ */ new Set();\n for (const runtime of groupRuntimes) {\n if (runtime.blockedTargets.length === 0 || runtime.supportTags.length === 0) {\n continue;\n }\n runtime.blockedTargets.forEach((cardId) => blockedTargetIds.add(cardId));\n for (const tag of runtime.supportTags) {\n supportTags.add(tag);\n boostTags[tag] = (boostTags[tag] ?? 1) * runtime.supportMultiplier;\n }\n }\n return {\n boostTags,\n blockedTargetIds: [...blockedTargetIds].sort(),\n supportTags: [...supportTags].sort()\n };\n }\n parseConfig(serializedData) {\n try {\n const parsed = JSON.parse(serializedData);\n const groupsRaw = Array.isArray(parsed.groups) ? parsed.groups : [];\n const groups = groupsRaw.map((raw, i) => ({\n id: typeof raw.id === \"string\" && raw.id.trim().length > 0 ? raw.id : `group-${i + 1}`,\n targetCardIds: dedupe(\n Array.isArray(raw.targetCardIds) ? raw.targetCardIds.filter((v) => typeof v === \"string\") : []\n ),\n supportCardIds: dedupe(\n Array.isArray(raw.supportCardIds) ? raw.supportCardIds.filter((v) => typeof v === \"string\") : []\n ),\n supportTagPatterns: dedupe(\n Array.isArray(raw.supportTagPatterns) ? raw.supportTagPatterns.filter((v) => typeof v === \"string\") : []\n ),\n freshnessWindowSessions: typeof raw.freshnessWindowSessions === \"number\" ? raw.freshnessWindowSessions : DEFAULT_FRESHNESS_WINDOW,\n maxDirectTargetsPerRun: typeof raw.maxDirectTargetsPerRun === \"number\" ? raw.maxDirectTargetsPerRun : DEFAULT_MAX_DIRECT_PER_RUN,\n maxSupportCardsPerRun: typeof raw.maxSupportCardsPerRun === \"number\" ? raw.maxSupportCardsPerRun : DEFAULT_MAX_SUPPORT_PER_RUN,\n hierarchyWalk: {\n enabled: raw.hierarchyWalk?.enabled !== false,\n maxDepth: typeof raw.hierarchyWalk?.maxDepth === \"number\" ? raw.hierarchyWalk.maxDepth : DEFAULT_HIERARCHY_DEPTH\n },\n retireOnEncounter: raw.retireOnEncounter !== false\n })).filter((g) => g.targetCardIds.length > 0);\n return { groups };\n } catch {\n return { groups: [] };\n }\n }\n async loadHierarchyConfigs() {\n try {\n const strategies = await this.course.getAllNavigationStrategies();\n return strategies.filter((s) => s.implementingClass === \"hierarchyDefinition\").map((s) => {\n try {\n const parsed = JSON.parse(s.serializedData);\n return {\n prerequisites: parsed.prerequisites || {}\n };\n } catch {\n return { prerequisites: {} };\n }\n });\n } catch (e) {\n logger.debug(`[Prescribed] Failed to load hierarchy configs: ${e}`);\n return [];\n }\n }\n buildGroupRuntimeState(args) {\n const {\n group,\n priorState,\n activeIds,\n seenIds,\n tagsByCard,\n cardsByTag,\n hierarchyConfigs,\n userTagElo,\n userGlobalElo\n } = args;\n const encounteredTargets = /* @__PURE__ */ new Set();\n for (const cardId of group.targetCardIds) {\n if (activeIds.has(cardId) || seenIds.has(cardId)) {\n encounteredTargets.add(cardId);\n }\n }\n if (priorState?.encounteredCardIds?.length) {\n for (const cardId of priorState.encounteredCardIds) {\n encounteredTargets.add(cardId);\n }\n }\n const pendingTargets = group.targetCardIds.filter((id) => !encounteredTargets.has(id));\n const targetTags = /* @__PURE__ */ new Map();\n for (const cardId of pendingTargets) {\n targetTags.set(cardId, tagsByCard.get(cardId) ?? []);\n }\n const blockedTargets = [];\n const surfaceableTargets = [];\n const supportTags = /* @__PURE__ */ new Set();\n for (const cardId of pendingTargets) {\n const tags = targetTags.get(cardId) ?? [];\n const resolution = this.resolveBlockedSupportTags(\n tags,\n hierarchyConfigs,\n userTagElo,\n userGlobalElo,\n group.hierarchyWalk?.enabled !== false,\n group.hierarchyWalk?.maxDepth ?? DEFAULT_HIERARCHY_DEPTH\n );\n const introTags = tags.filter((tag) => tag.startsWith(\"gpc:intro:\"));\n const exposeTags = new Set(tags.filter((tag) => tag.startsWith(\"gpc:expose:\")));\n for (const introTag of introTags) {\n const suffix = introTag.slice(\"gpc:intro:\".length);\n if (suffix) {\n exposeTags.add(`gpc:expose:${suffix}`);\n }\n }\n const unmetExposeTags = [...exposeTags].filter((tag) => {\n const tagElo = userTagElo[tag];\n return !tagElo || tagElo.count < DEFAULT_MIN_COUNT;\n });\n if (unmetExposeTags.length > 0) {\n unmetExposeTags.forEach((tag) => supportTags.add(tag));\n }\n if (resolution.blocked || unmetExposeTags.length > 0) {\n blockedTargets.push(cardId);\n resolution.supportTags.forEach((t) => supportTags.add(t));\n } else {\n surfaceableTargets.push(cardId);\n }\n }\n const supportCandidates = dedupe([\n ...group.supportCardIds ?? [],\n ...this.findSupportCardsByTags(\n group,\n tagsByCard,\n [...supportTags]\n )\n ]).filter((id) => !activeIds.has(id) && !seenIds.has(id));\n const discoveredSupportCandidates = blockedTargets.length > 0 && supportTags.size > 0 && supportCandidates.length === 0 ? this.findDiscoveredSupportCards({\n supportTags: [...supportTags],\n cardsByTag,\n activeIds,\n seenIds,\n excludedIds: /* @__PURE__ */ new Set([\n ...group.targetCardIds,\n ...group.supportCardIds ?? []\n ]),\n limit: group.maxSupportCardsPerRun ?? DEFAULT_MAX_SUPPORT_PER_RUN\n }) : [];\n if (blockedTargets.length > 0 && supportTags.size > 0 && discoveredSupportCandidates.length === 0) {\n logger.info(\n `[Prescribed] Group '${group.id}' discovered 0 broader support candidates (blocked=${blockedTargets.length}; authoredSupport=${supportCandidates.length})`\n );\n }\n const sessionsSinceSurfaced = priorState?.sessionsSinceSurfaced ?? 0;\n const freshnessWindow = group.freshnessWindowSessions ?? DEFAULT_FRESHNESS_WINDOW;\n const staleSessions = Math.max(0, sessionsSinceSurfaced - freshnessWindow);\n const pressureMultiplier = pendingTargets.length === 0 ? 1 : clamp(1 + staleSessions * 0.75 + Math.min(2, pendingTargets.length * 0.1), 1, MAX_TARGET_MULTIPLIER);\n const supportMultiplier = blockedTargets.length === 0 ? 1 : clamp(1 + staleSessions * 0.5 + Math.min(1.5, blockedTargets.length * 0.15), 1, MAX_SUPPORT_MULTIPLIER);\n return {\n group,\n encounteredTargets,\n pendingTargets,\n blockedTargets,\n surfaceableTargets,\n targetTags,\n supportCandidates,\n discoveredSupportCandidates,\n supportTags: [...supportTags],\n pressureMultiplier,\n supportMultiplier,\n debugVersion: PRESCRIBED_DEBUG_VERSION\n };\n }\n buildNextGroupState(runtime, prior) {\n const carriedSessions = prior?.sessionsSinceSurfaced ?? 0;\n const surfacedThisRun = false;\n return {\n encounteredCardIds: [...runtime.encounteredTargets].sort(),\n pendingTargetIds: [...runtime.pendingTargets].sort(),\n lastSurfacedAt: prior?.lastSurfacedAt ?? null,\n sessionsSinceSurfaced: surfacedThisRun ? 0 : carriedSessions + 1,\n lastSupportAt: prior?.lastSupportAt ?? null,\n blockedTargetIds: [...runtime.blockedTargets].sort(),\n lastResolvedSupportTags: [...runtime.supportTags].sort()\n };\n }\n buildDirectTargetCards(runtime, courseId, emittedIds) {\n const maxDirect = runtime.group.maxDirectTargetsPerRun ?? DEFAULT_MAX_DIRECT_PER_RUN;\n const directIds = runtime.surfaceableTargets.filter((id) => !emittedIds.has(id)).slice(0, maxDirect);\n const cards = [];\n for (const cardId of directIds) {\n emittedIds.add(cardId);\n cards.push({\n cardId,\n courseId,\n score: BASE_TARGET_SCORE * runtime.pressureMultiplier,\n provenance: [\n {\n strategy: \"prescribed\",\n strategyName: this.strategyName || this.name,\n strategyId: this.strategyId || \"NAVIGATION_STRATEGY-prescribed\",\n action: \"generated\",\n score: BASE_TARGET_SCORE * runtime.pressureMultiplier,\n reason: `mode=target;group=${runtime.group.id};pending=${runtime.pendingTargets.length};surfaceable=${runtime.surfaceableTargets.length};blocked=${runtime.blockedTargets.length};blockedTargets=${runtime.blockedTargets.join(\"|\") || \"none\"};supportTags=${runtime.supportTags.join(\"|\") || \"none\"};multiplier=${runtime.pressureMultiplier.toFixed(2)};testversion=${runtime.debugVersion}`\n }\n ]\n });\n }\n return cards;\n }\n buildSupportCards(runtime, courseId, emittedIds) {\n if (runtime.blockedTargets.length === 0 || runtime.supportCandidates.length === 0) {\n return [];\n }\n const maxSupport = runtime.group.maxSupportCardsPerRun ?? DEFAULT_MAX_SUPPORT_PER_RUN;\n const supportIds = runtime.supportCandidates.filter((id) => !emittedIds.has(id)).slice(0, maxSupport);\n const cards = [];\n for (const cardId of supportIds) {\n emittedIds.add(cardId);\n cards.push({\n cardId,\n courseId,\n score: BASE_SUPPORT_SCORE * runtime.supportMultiplier,\n provenance: [\n {\n strategy: \"prescribed\",\n strategyName: this.strategyName || this.name,\n strategyId: this.strategyId || \"NAVIGATION_STRATEGY-prescribed\",\n action: \"generated\",\n score: BASE_SUPPORT_SCORE * runtime.supportMultiplier,\n reason: `mode=support;group=${runtime.group.id};pending=${runtime.pendingTargets.length};blocked=${runtime.blockedTargets.length};blockedTargets=${runtime.blockedTargets.join(\"|\") || \"none\"};supportCard=${cardId};supportTags=${runtime.supportTags.join(\"|\") || \"none\"};multiplier=${runtime.supportMultiplier.toFixed(2)};testversion=${runtime.debugVersion}`\n }\n ]\n });\n }\n return cards;\n }\n buildDiscoveredSupportCards(runtime, courseId, emittedIds) {\n if (runtime.blockedTargets.length === 0 || runtime.discoveredSupportCandidates.length === 0) {\n return [];\n }\n const maxSupport = runtime.group.maxSupportCardsPerRun ?? DEFAULT_MAX_SUPPORT_PER_RUN;\n const supportIds = runtime.discoveredSupportCandidates.filter((id) => !emittedIds.has(id)).slice(0, maxSupport);\n const cards = [];\n for (const cardId of supportIds) {\n emittedIds.add(cardId);\n cards.push({\n cardId,\n courseId,\n score: DISCOVERED_SUPPORT_SCORE * runtime.supportMultiplier,\n provenance: [\n {\n strategy: \"prescribed\",\n strategyName: this.strategyName || this.name,\n strategyId: this.strategyId || \"NAVIGATION_STRATEGY-prescribed\",\n action: \"generated\",\n score: DISCOVERED_SUPPORT_SCORE * runtime.supportMultiplier,\n reason: `mode=discovered-support;group=${runtime.group.id};pending=${runtime.pendingTargets.length};blocked=${runtime.blockedTargets.length};blockedTargets=${runtime.blockedTargets.join(\"|\") || \"none\"};supportCard=${cardId};supportTags=${runtime.supportTags.join(\"|\") || \"none\"};multiplier=${runtime.supportMultiplier.toFixed(2)};testversion=${runtime.debugVersion}`\n }\n ]\n });\n }\n return cards;\n }\n findSupportCardsByTags(group, tagsByCard, supportTags) {\n if (supportTags.length === 0) {\n return [];\n }\n const explicitSupportIds = group.supportCardIds ?? [];\n const explicitPatterns = group.supportTagPatterns ?? [];\n if (explicitSupportIds.length === 0 && explicitPatterns.length === 0) {\n return [];\n }\n const candidates = /* @__PURE__ */ new Set();\n for (const cardId of explicitSupportIds) {\n const cardTags = tagsByCard.get(cardId) ?? [];\n const matchesResolved = supportTags.some((supportTag) => cardTags.includes(supportTag));\n const matchesPattern = explicitPatterns.some(\n (pattern) => cardTags.some((tag) => matchesTagPattern(tag, pattern))\n );\n if (matchesResolved || matchesPattern) {\n candidates.add(cardId);\n }\n }\n return [...candidates];\n }\n findDiscoveredSupportCards(args) {\n const { supportTags, cardsByTag, activeIds, seenIds, excludedIds, limit } = args;\n const byCardId = /* @__PURE__ */ new Map();\n for (const supportTag of supportTags) {\n const taggedCards = cardsByTag.get(supportTag) ?? [];\n for (const cardId of taggedCards) {\n if (activeIds.has(cardId) || seenIds.has(cardId) || excludedIds.has(cardId)) {\n continue;\n }\n const existing = byCardId.get(cardId);\n if (existing) {\n existing.matches += 1;\n } else {\n byCardId.set(cardId, { cardId, matches: 1 });\n }\n }\n }\n const candidates = [...byCardId.values()].sort((a, b) => b.matches - a.matches || a.cardId.localeCompare(b.cardId));\n const usedStems = /* @__PURE__ */ new Set();\n const diverse = [];\n const deferred = [];\n for (const entry of candidates) {\n const stem = extractWordStem(entry.cardId);\n if (!usedStems.has(stem)) {\n usedStems.add(stem);\n diverse.push(entry);\n } else {\n deferred.push(entry);\n }\n }\n shuffleInPlace(diverse);\n shuffleInPlace(deferred);\n return [...diverse, ...deferred].slice(0, limit).map((entry) => entry.cardId);\n }\n resolveBlockedSupportTags(targetTags, hierarchyConfigs, userTagElo, userGlobalElo, hierarchyWalkEnabled, maxDepth) {\n const supportTags = /* @__PURE__ */ new Set();\n let blocked = false;\n for (const targetTag of targetTags) {\n const prereqSets = hierarchyConfigs.map((hierarchy) => hierarchy.prerequisites[targetTag]).filter((prereqs) => Array.isArray(prereqs) && prereqs.length > 0);\n if (prereqSets.length === 0) {\n continue;\n }\n const tagBlocked = prereqSets.some(\n (prereqs) => prereqs.some((pr) => !this.isPrerequisiteMet(pr, userTagElo[pr.tag], userGlobalElo))\n );\n if (!tagBlocked) {\n continue;\n }\n blocked = true;\n if (!hierarchyWalkEnabled) {\n for (const prereqs of prereqSets) {\n for (const prereq of prereqs) {\n if (!this.isPrerequisiteMet(prereq, userTagElo[prereq.tag], userGlobalElo)) {\n supportTags.add(prereq.tag);\n }\n }\n }\n continue;\n }\n for (const prereqs of prereqSets) {\n for (const prereq of prereqs) {\n if (!this.isPrerequisiteMet(prereq, userTagElo[prereq.tag], userGlobalElo)) {\n this.collectSupportTagsRecursive(\n prereq.tag,\n hierarchyConfigs,\n userTagElo,\n userGlobalElo,\n maxDepth,\n /* @__PURE__ */ new Set(),\n supportTags\n );\n }\n }\n }\n }\n return { blocked, supportTags: [...supportTags] };\n }\n collectSupportTagsRecursive(tag, hierarchyConfigs, userTagElo, userGlobalElo, depth, visited, out) {\n if (depth < 0 || visited.has(tag)) return;\n visited.add(tag);\n let walkedFurther = false;\n for (const hierarchy of hierarchyConfigs) {\n const prereqs = hierarchy.prerequisites[tag];\n if (!prereqs || prereqs.length === 0) continue;\n const unmet = prereqs.filter(\n (pr) => !this.isPrerequisiteMet(pr, userTagElo[pr.tag], userGlobalElo)\n );\n if (unmet.length > 0 && depth > 0) {\n walkedFurther = true;\n for (const prereq of unmet) {\n this.collectSupportTagsRecursive(\n prereq.tag,\n hierarchyConfigs,\n userTagElo,\n userGlobalElo,\n depth - 1,\n visited,\n out\n );\n }\n }\n }\n if (!walkedFurther) {\n out.add(tag);\n }\n }\n isPrerequisiteMet(prereq, userTagElo, userGlobalElo) {\n if (!userTagElo) return false;\n const minCount = prereq.masteryThreshold?.minCount ?? DEFAULT_MIN_COUNT;\n if (userTagElo.count < minCount) return false;\n if (prereq.masteryThreshold?.minElo !== void 0) {\n return userTagElo.score >= prereq.masteryThreshold.minElo;\n }\n if (prereq.masteryThreshold?.minCount !== void 0) {\n return true;\n }\n return userTagElo.score >= userGlobalElo;\n }\n };\n }\n});\n\n// src/core/navigators/generators/srs.ts\nvar srs_exports = {};\n__export(srs_exports, {\n default: () => SRSNavigator\n});\nimport moment3 from \"moment\";\nvar DEFAULT_HEALTHY_BACKLOG, MAX_BACKLOG_PRESSURE, SRSNavigator;\nvar init_srs = __esm({\n \"src/core/navigators/generators/srs.ts\"() {\n \"use strict\";\n init_navigators();\n init_logger();\n DEFAULT_HEALTHY_BACKLOG = 20;\n MAX_BACKLOG_PRESSURE = 0.5;\n SRSNavigator = class extends ContentNavigator {\n /** Human-readable name for CardGenerator interface */\n name;\n /** Healthy backlog threshold - when exceeded, backlog pressure kicks in */\n healthyBacklog;\n constructor(user, course, strategyData) {\n super(user, course, strategyData);\n this.name = strategyData?.name || \"SRS\";\n const config = this.parseConfig(strategyData?.serializedData);\n this.healthyBacklog = config.healthyBacklog ?? DEFAULT_HEALTHY_BACKLOG;\n }\n /**\n * Parse configuration from serialized JSON.\n */\n parseConfig(serializedData) {\n if (!serializedData) return {};\n try {\n return JSON.parse(serializedData);\n } catch {\n logger.warn(\"[SRS] Failed to parse strategy config, using defaults\");\n return {};\n }\n }\n /**\n * Get review cards scored by urgency.\n *\n * Score formula combines:\n * - Relative overdueness: hoursOverdue / intervalHours\n * - Interval recency: exponential decay favoring shorter intervals\n * - Backlog pressure: boost when due reviews exceed healthy threshold\n *\n * Cards not yet due are excluded (not scored as 0).\n *\n * This method supports both the legacy signature (limit only) and the\n * CardGenerator interface signature (limit, context).\n *\n * @param limit - Maximum number of cards to return\n * @param _context - Optional GeneratorContext (currently unused, but required for interface)\n */\n async getWeightedCards(limit, _context) {\n if (!this.user || !this.course) {\n throw new Error(\"SRSNavigator requires user and course to be set\");\n }\n const courseId = this.course.getCourseID();\n const reviews = await this.user.getPendingReviews(courseId);\n const now = moment3.utc();\n let dueReviews = reviews.filter((r) => now.isAfter(moment3.utc(r.reviewTime)));\n if (dueReviews.length > 0) {\n const dueCardIds = [...new Set(dueReviews.map((r) => r.cardId))];\n const tagsByCard = await this.course.getAppliedTagsBatch(dueCardIds);\n const skippedReviewIds = [];\n dueReviews = dueReviews.filter((r) => {\n const tags = tagsByCard.get(r.cardId) ?? [];\n if (tags.includes(\"srs:skip\")) {\n skippedReviewIds.push(r._id);\n return false;\n }\n return true;\n });\n if (skippedReviewIds.length > 0) {\n logger.info(`[SRS] Removing ${skippedReviewIds.length} scheduled reviews for srs:skip cards`);\n for (const id of skippedReviewIds) {\n void this.user.removeScheduledCardReview(id);\n }\n }\n }\n const backlogPressure = this.computeBacklogPressure(dueReviews.length);\n if (dueReviews.length > 0) {\n const pressureNote = backlogPressure > 0 ? ` [backlog pressure: +${backlogPressure.toFixed(2)}]` : ` [healthy backlog]`;\n logger.info(\n `[SRS] Course ${courseId}: ${dueReviews.length} reviews due now (of ${reviews.length} scheduled)${pressureNote}`\n );\n } else if (reviews.length > 0) {\n const sortedByDue = [...reviews].sort(\n (a, b) => moment3.utc(a.reviewTime).diff(moment3.utc(b.reviewTime))\n );\n const nextDue = sortedByDue[0];\n const nextDueTime = moment3.utc(nextDue.reviewTime);\n const untilDue = moment3.duration(nextDueTime.diff(now));\n const untilDueStr = untilDue.asHours() < 1 ? `${Math.round(untilDue.asMinutes())}m` : untilDue.asHours() < 24 ? `${Math.round(untilDue.asHours())}h` : `${Math.round(untilDue.asDays())}d`;\n logger.info(\n `[SRS] Course ${courseId}: 0 reviews due now (${reviews.length} scheduled, next in ${untilDueStr})`\n );\n } else {\n logger.info(`[SRS] Course ${courseId}: No reviews scheduled`);\n }\n const scored = dueReviews.map((review) => {\n const { score, reason } = this.computeUrgencyScore(review, now, backlogPressure);\n return {\n cardId: review.cardId,\n courseId: review.courseId,\n score,\n reviewID: review._id,\n provenance: [\n {\n strategy: \"srs\",\n strategyName: this.strategyName || this.name,\n strategyId: this.strategyId || \"NAVIGATION_STRATEGY-SRS-default\",\n action: \"generated\",\n score,\n reason\n }\n ]\n };\n });\n return { cards: scored.sort((a, b) => b.score - a.score).slice(0, limit) };\n }\n /**\n * Compute backlog pressure based on number of due reviews.\n *\n * Backlog pressure is 0 when at or below healthy threshold,\n * and increases linearly above it, maxing out at MAX_BACKLOG_PRESSURE.\n *\n * Examples (with default healthyBacklog=20):\n * - 10 due reviews → 0.00 (healthy)\n * - 20 due reviews → 0.00 (at threshold)\n * - 40 due reviews → 0.25 (2x threshold)\n * - 60 due reviews → 0.50 (3x threshold, maxed)\n *\n * @param dueCount - Number of reviews currently due\n * @returns Backlog pressure score to add to urgency (0 to MAX_BACKLOG_PRESSURE)\n */\n computeBacklogPressure(dueCount) {\n if (dueCount <= this.healthyBacklog) {\n return 0;\n }\n const excess = dueCount - this.healthyBacklog;\n const pressure = excess / this.healthyBacklog * (MAX_BACKLOG_PRESSURE / 2);\n return Math.min(MAX_BACKLOG_PRESSURE, pressure);\n }\n /**\n * Compute urgency score for a review card.\n *\n * Three factors:\n * 1. Relative overdueness = hoursOverdue / intervalHours\n * - 2 days overdue on 3-day interval = 0.67 (urgent)\n * - 2 days overdue on 180-day interval = 0.01 (not urgent)\n *\n * 2. Interval recency factor = 0.3 + 0.7 * exp(-intervalHours / 720)\n * - 24h interval → ~1.0 (very recent learning)\n * - 30 days (720h) → ~0.56\n * - 180 days → ~0.30\n *\n * 3. Backlog pressure = global boost when review backlog exceeds healthy threshold\n * - At healthy backlog: 0\n * - At 2x healthy: +0.25\n * - At 3x+ healthy: +0.50 (max)\n *\n * Combined: base 0.5 + (urgency factors * 0.45) + backlog pressure\n * Result range: 0.5 to 1.0 (uncapped to allow high-urgency reviews to compete with new cards)\n *\n * @param review - The scheduled card to score\n * @param now - Current time\n * @param backlogPressure - Pre-computed backlog pressure (0 to 0.5)\n */\n computeUrgencyScore(review, now, backlogPressure) {\n const scheduledAt = moment3.utc(review.scheduledAt);\n const due = moment3.utc(review.reviewTime);\n const intervalHours = Math.max(1, due.diff(scheduledAt, \"hours\"));\n const hoursOverdue = now.diff(due, \"hours\");\n const relativeOverdue = hoursOverdue / intervalHours;\n const recencyFactor = 0.3 + 0.7 * Math.exp(-intervalHours / 720);\n const overdueContribution = Math.min(1, Math.max(0, relativeOverdue));\n const urgency = overdueContribution * 0.5 + recencyFactor * 0.5;\n const baseScore = 0.5 + urgency * 0.45;\n const score = Math.min(1, baseScore + backlogPressure);\n const reasonParts = [\n `${Math.round(hoursOverdue)}h overdue`,\n `interval: ${Math.round(intervalHours)}h`,\n `relative: ${relativeOverdue.toFixed(2)}`,\n `recency: ${recencyFactor.toFixed(2)}`\n ];\n if (backlogPressure > 0) {\n reasonParts.push(`backlog: +${backlogPressure.toFixed(2)}`);\n }\n reasonParts.push(\"review\");\n const reason = reasonParts.join(\", \");\n return { score, reason };\n }\n };\n }\n});\n\n// src/core/navigators/generators/types.ts\nvar types_exports = {};\nvar init_types = __esm({\n \"src/core/navigators/generators/types.ts\"() {\n \"use strict\";\n }\n});\n\n// import(\"./generators/**/*\") in src/core/navigators/index.ts\nvar globImport_generators;\nvar init_ = __esm({\n 'import(\"./generators/**/*\") in src/core/navigators/index.ts'() {\n globImport_generators = __glob({\n \"./generators/CompositeGenerator.ts\": () => Promise.resolve().then(() => (init_CompositeGenerator(), CompositeGenerator_exports)),\n \"./generators/elo.ts\": () => Promise.resolve().then(() => (init_elo(), elo_exports)),\n \"./generators/index.ts\": () => Promise.resolve().then(() => (init_generators(), generators_exports)),\n \"./generators/prescribed.ts\": () => Promise.resolve().then(() => (init_prescribed(), prescribed_exports)),\n \"./generators/srs.ts\": () => Promise.resolve().then(() => (init_srs(), srs_exports)),\n \"./generators/types.ts\": () => Promise.resolve().then(() => (init_types(), types_exports))\n });\n }\n});\n\n// src/core/types/contentNavigationStrategy.ts\nvar DEFAULT_LEARNABLE_WEIGHT;\nvar init_contentNavigationStrategy = __esm({\n \"src/core/types/contentNavigationStrategy.ts\"() {\n \"use strict\";\n DEFAULT_LEARNABLE_WEIGHT = {\n weight: 1,\n confidence: 0.1,\n // Low confidence initially = wide exploration\n sampleSize: 0\n };\n }\n});\n\n// src/core/navigators/filters/WeightedFilter.ts\nvar WeightedFilter_exports = {};\n__export(WeightedFilter_exports, {\n WeightedFilter: () => WeightedFilter\n});\nvar WeightedFilter;\nvar init_WeightedFilter = __esm({\n \"src/core/navigators/filters/WeightedFilter.ts\"() {\n \"use strict\";\n init_contentNavigationStrategy();\n WeightedFilter = class {\n name;\n inner;\n learnable;\n staticWeight;\n strategyId;\n constructor(inner, learnable = DEFAULT_LEARNABLE_WEIGHT, staticWeight = false, strategyId) {\n this.inner = inner;\n this.name = inner.name;\n this.learnable = learnable;\n this.staticWeight = staticWeight;\n this.strategyId = strategyId;\n }\n /**\n * Apply the inner filter, then scale its effect by the configured weight.\n */\n async transform(cards, context) {\n let effectiveWeight = this.learnable.weight;\n let deviation;\n if (!this.staticWeight && context.orchestration) {\n const strategyId = this.strategyId || this.inner.strategyId || this.name;\n effectiveWeight = context.orchestration.getEffectiveWeight(strategyId, this.learnable);\n deviation = context.orchestration.getDeviation(strategyId);\n }\n if (Math.abs(effectiveWeight - 1) < 1e-3) {\n return this.inner.transform(cards, context);\n }\n const originalScores = /* @__PURE__ */ new Map();\n for (const card of cards) {\n originalScores.set(card.cardId, card.score);\n }\n const transformedCards = await this.inner.transform(cards, context);\n return transformedCards.map((card) => {\n const originalScore = originalScores.get(card.cardId);\n if (originalScore === void 0 || originalScore === 0 || card.score === 0) {\n return card;\n }\n const rawEffect = card.score / originalScore;\n if (Math.abs(rawEffect - 1) < 1e-4) {\n return card;\n }\n const weightedEffect = Math.pow(rawEffect, effectiveWeight);\n const newScore = originalScore * weightedEffect;\n const lastProvIndex = card.provenance.length - 1;\n const lastProv = card.provenance[lastProvIndex];\n if (lastProv) {\n const updatedProvenance = [...card.provenance];\n updatedProvenance[lastProvIndex] = {\n ...lastProv,\n score: newScore,\n effectiveWeight,\n deviation\n // We can optionally append to the reason, but the structured field is key\n };\n return {\n ...card,\n score: newScore,\n provenance: updatedProvenance\n };\n }\n return {\n ...card,\n score: newScore\n };\n });\n }\n };\n }\n});\n\n// src/core/navigators/filters/eloDistance.ts\nvar eloDistance_exports = {};\n__export(eloDistance_exports, {\n DEFAULT_HALF_LIFE: () => DEFAULT_HALF_LIFE,\n DEFAULT_MAX_MULTIPLIER: () => DEFAULT_MAX_MULTIPLIER,\n DEFAULT_MIN_MULTIPLIER: () => DEFAULT_MIN_MULTIPLIER,\n createEloDistanceFilter: () => createEloDistanceFilter\n});\nfunction computeMultiplier(distance, halfLife, minMultiplier, maxMultiplier) {\n const normalizedDistance = distance / halfLife;\n const decay = Math.exp(-(normalizedDistance * normalizedDistance));\n return minMultiplier + (maxMultiplier - minMultiplier) * decay;\n}\nfunction createEloDistanceFilter(config) {\n const halfLife = config?.halfLife ?? DEFAULT_HALF_LIFE;\n const minMultiplier = config?.minMultiplier ?? DEFAULT_MIN_MULTIPLIER;\n const maxMultiplier = config?.maxMultiplier ?? DEFAULT_MAX_MULTIPLIER;\n return {\n name: \"ELO Distance Filter\",\n async transform(cards, context) {\n const { course, userElo } = context;\n const cardIds = cards.map((c) => c.cardId);\n const cardElos = await course.getCardEloData(cardIds);\n return cards.map((card, i) => {\n const cardElo = cardElos[i]?.global?.score ?? 1e3;\n const distance = Math.abs(cardElo - userElo);\n const multiplier = computeMultiplier(distance, halfLife, minMultiplier, maxMultiplier);\n const newScore = card.score * multiplier;\n const action = multiplier < maxMultiplier - 0.01 ? \"penalized\" : \"passed\";\n return {\n ...card,\n score: newScore,\n provenance: [\n ...card.provenance,\n {\n strategy: \"eloDistance\",\n strategyName: \"ELO Distance Filter\",\n strategyId: \"ELO_DISTANCE_FILTER\",\n action,\n score: newScore,\n reason: `ELO distance ${Math.round(distance)} (card: ${Math.round(cardElo)}, user: ${Math.round(userElo)}) \\u2192 ${multiplier.toFixed(2)}x`\n }\n ]\n };\n });\n }\n };\n}\nvar DEFAULT_HALF_LIFE, DEFAULT_MIN_MULTIPLIER, DEFAULT_MAX_MULTIPLIER;\nvar init_eloDistance = __esm({\n \"src/core/navigators/filters/eloDistance.ts\"() {\n \"use strict\";\n DEFAULT_HALF_LIFE = 200;\n DEFAULT_MIN_MULTIPLIER = 0.3;\n DEFAULT_MAX_MULTIPLIER = 1;\n }\n});\n\n// src/core/navigators/filters/hierarchyDefinition.ts\nvar hierarchyDefinition_exports = {};\n__export(hierarchyDefinition_exports, {\n default: () => HierarchyDefinitionNavigator\n});\nimport { toCourseElo as toCourseElo3 } from \"@vue-skuilder/common\";\nvar DEFAULT_MIN_COUNT2, HierarchyDefinitionNavigator;\nvar init_hierarchyDefinition = __esm({\n \"src/core/navigators/filters/hierarchyDefinition.ts\"() {\n \"use strict\";\n init_navigators();\n init_logger();\n DEFAULT_MIN_COUNT2 = 3;\n HierarchyDefinitionNavigator = class extends ContentNavigator {\n config;\n /** Human-readable name for CardFilter interface */\n name;\n constructor(user, course, strategyData) {\n super(user, course, strategyData);\n this.config = this.parseConfig(strategyData.serializedData);\n this.name = strategyData.name || \"Hierarchy Definition\";\n }\n parseConfig(serializedData) {\n try {\n const parsed = JSON.parse(serializedData);\n return {\n prerequisites: parsed.prerequisites || {}\n };\n } catch {\n return {\n prerequisites: {}\n };\n }\n }\n /**\n * Check if a specific prerequisite is satisfied\n */\n isPrerequisiteMet(prereq, userTagElo, userGlobalElo) {\n if (!userTagElo) return false;\n const minCount = prereq.masteryThreshold?.minCount ?? DEFAULT_MIN_COUNT2;\n if (userTagElo.count < minCount) return false;\n if (prereq.masteryThreshold?.minElo !== void 0) {\n return userTagElo.score >= prereq.masteryThreshold.minElo;\n } else if (prereq.masteryThreshold?.minCount !== void 0) {\n return true;\n } else {\n return userTagElo.score >= userGlobalElo;\n }\n }\n /**\n * Get the set of tags the user has mastered.\n * A tag is \"mastered\" if it appears as a prerequisite somewhere and meets its threshold.\n */\n async getMasteredTags(context) {\n const mastered = /* @__PURE__ */ new Set();\n try {\n const courseReg = await context.user.getCourseRegDoc(context.course.getCourseID());\n const userElo = toCourseElo3(courseReg.elo);\n for (const prereqs of Object.values(this.config.prerequisites)) {\n for (const prereq of prereqs) {\n const tagElo = userElo.tags[prereq.tag];\n if (this.isPrerequisiteMet(prereq, tagElo, userElo.global.score)) {\n mastered.add(prereq.tag);\n }\n }\n }\n } catch {\n }\n return mastered;\n }\n /**\n * Get the set of tags that are unlocked (prerequisites met)\n */\n getUnlockedTags(masteredTags) {\n const unlocked = /* @__PURE__ */ new Set();\n for (const [tagId, prereqs] of Object.entries(this.config.prerequisites)) {\n const allPrereqsMet = prereqs.every((prereq) => masteredTags.has(prereq.tag));\n if (allPrereqsMet) {\n unlocked.add(tagId);\n }\n }\n return unlocked;\n }\n /**\n * Check if a tag has prerequisites defined in config\n */\n hasPrerequisites(tagId) {\n return tagId in this.config.prerequisites;\n }\n /**\n * Check if a card is unlocked and generate reason.\n */\n async checkCardUnlock(card, _course, unlockedTags, masteredTags) {\n try {\n const cardTags = card.tags ?? [];\n const lockedTags = cardTags.filter(\n (tag) => this.hasPrerequisites(tag) && !unlockedTags.has(tag)\n );\n if (lockedTags.length === 0) {\n const tagList = cardTags.length > 0 ? cardTags.join(\", \") : \"none\";\n return {\n isUnlocked: true,\n reason: `Prerequisites met, tags: ${tagList}`\n };\n }\n const missingPrereqs = lockedTags.flatMap((tag) => {\n const prereqs = this.config.prerequisites[tag] || [];\n return prereqs.filter((p) => !masteredTags.has(p.tag)).map((p) => p.tag);\n });\n return {\n isUnlocked: false,\n reason: `Blocked: missing prerequisites ${missingPrereqs.join(\", \")} for tags ${lockedTags.join(\", \")}`\n };\n } catch {\n return {\n isUnlocked: true,\n reason: \"Prerequisites check skipped (tag lookup failed)\"\n };\n }\n }\n /**\n * Build a map of prereq tag → max configured boost for all *closed* gates.\n *\n * When a gate is closed (prereqs unmet), cards carrying that gate's prereq\n * tags get boosted — steering the pipeline toward content that helps unlock\n * the gated material. Once the gate opens, the boost disappears.\n */\n getPreReqBoosts(unlockedTags, masteredTags) {\n const boosts = /* @__PURE__ */ new Map();\n for (const [tagId, prereqs] of Object.entries(this.config.prerequisites)) {\n if (unlockedTags.has(tagId)) continue;\n for (const prereq of prereqs) {\n if (!prereq.preReqBoost || prereq.preReqBoost <= 1) continue;\n if (masteredTags.has(prereq.tag)) continue;\n const existing = boosts.get(prereq.tag) ?? 1;\n boosts.set(prereq.tag, Math.max(existing, prereq.preReqBoost));\n }\n }\n return boosts;\n }\n /**\n * Build a map of gated tag → max configured targetBoost for all *open* gates.\n *\n * When a gate opens (prereqs met), cards carrying the gated tag get boosted —\n * ensuring newly-unlocked content surfaces promptly. The boost is a static\n * multiplier; natural ELO/SRS deprioritization after interaction handles decay.\n */\n getTargetBoosts(unlockedTags) {\n const boosts = /* @__PURE__ */ new Map();\n const configKeys = Object.keys(this.config.prerequisites);\n const unlockedArr = [...unlockedTags];\n logger.info(\n `[HierarchyDefinition:targetBoost:trace] ${this.name} | configKeys=${configKeys.length}, unlocked=${unlockedArr.length} (${unlockedArr.slice(0, 5).join(\", \")}${unlockedArr.length > 5 ? \"...\" : \"\"})`\n );\n for (const [tagId, prereqs] of Object.entries(this.config.prerequisites)) {\n if (!unlockedTags.has(tagId)) continue;\n logger.info(\n `[HierarchyDefinition:targetBoost:trace] UNLOCKED ${tagId}: ${prereqs.length} prereqs, raw=${JSON.stringify(prereqs.map((p) => ({ tag: p.tag, tb: p.targetBoost })))}`\n );\n for (const prereq of prereqs) {\n if (!prereq.targetBoost || prereq.targetBoost <= 1) continue;\n const existing = boosts.get(tagId) ?? 1;\n boosts.set(tagId, Math.max(existing, prereq.targetBoost));\n }\n }\n if (boosts.size > 0) {\n logger.info(\n `[HierarchyDefinition] targetBoosts active: ${[...boosts.entries()].map(([t, b]) => `${t}=\\xD7${b}`).join(\", \")}`\n );\n } else {\n logger.info(\n `[HierarchyDefinition:targetBoost:trace] no targetBoosts found despite ${unlockedArr.length} unlocked tags`\n );\n }\n return boosts;\n }\n /**\n * CardFilter.transform implementation.\n *\n * Three effects:\n * 1. Cards with locked tags receive score * 0.02 (gating penalty)\n * 2. Cards carrying prereq tags of closed gates receive preReqBoost\n * 3. Cards carrying gated tags of open gates receive targetBoost\n */\n async transform(cards, context) {\n const masteredTags = await this.getMasteredTags(context);\n const unlockedTags = this.getUnlockedTags(masteredTags);\n const preReqBoosts = this.getPreReqBoosts(unlockedTags, masteredTags);\n const targetBoosts = this.getTargetBoosts(unlockedTags);\n const gated = [];\n for (const card of cards) {\n const { isUnlocked, reason } = await this.checkCardUnlock(\n card,\n context.course,\n unlockedTags,\n masteredTags\n );\n const LOCKED_PENALTY = 0.02;\n let finalScore = isUnlocked ? card.score : card.score * LOCKED_PENALTY;\n let action = isUnlocked ? \"passed\" : \"penalized\";\n let finalReason = reason;\n if (isUnlocked && preReqBoosts.size > 0) {\n const cardTags = card.tags ?? [];\n let maxBoost = 1;\n const boostedPrereqs = [];\n for (const tag of cardTags) {\n const boost = preReqBoosts.get(tag);\n if (boost && boost > maxBoost) {\n maxBoost = boost;\n boostedPrereqs.push(tag);\n }\n }\n if (maxBoost > 1) {\n finalScore *= maxBoost;\n action = \"boosted\";\n finalReason = `${reason} | preReqBoost \\xD7${maxBoost.toFixed(2)} for ${boostedPrereqs.join(\", \")}`;\n logger.info(\n `[HierarchyDefinition] preReqBoost \\xD7${maxBoost.toFixed(2)} applied to card ${card.cardId} via tags [${boostedPrereqs.join(\", \")}] (score: ${card.score.toFixed(3)} \\u2192 ${finalScore.toFixed(3)})`\n );\n }\n }\n if (isUnlocked && targetBoosts.size > 0) {\n const cardTags = card.tags ?? [];\n let maxTargetBoost = 1;\n const boostedTargets = [];\n for (const tag of cardTags) {\n const boost = targetBoosts.get(tag);\n if (boost && boost > maxTargetBoost) {\n maxTargetBoost = boost;\n boostedTargets.push(tag);\n }\n }\n if (maxTargetBoost > 1) {\n finalScore *= maxTargetBoost;\n action = \"boosted\";\n finalReason = `${finalReason} | targetBoost \\xD7${maxTargetBoost.toFixed(2)} for ${boostedTargets.join(\", \")}`;\n logger.info(\n `[HierarchyDefinition] targetBoost \\xD7${maxTargetBoost.toFixed(2)} applied to card ${card.cardId} via tags [${boostedTargets.join(\", \")}] (score: ${card.score.toFixed(3)} \\u2192 ${finalScore.toFixed(3)})`\n );\n }\n }\n gated.push({\n ...card,\n score: finalScore,\n provenance: [\n ...card.provenance,\n {\n strategy: \"hierarchyDefinition\",\n strategyName: this.strategyName || this.name,\n strategyId: this.strategyId || \"NAVIGATION_STRATEGY-hierarchy\",\n action,\n score: finalScore,\n reason: finalReason\n }\n ]\n });\n }\n return gated;\n }\n /**\n * Legacy getWeightedCards - now throws as filters should not be used as generators.\n *\n * Use transform() via Pipeline instead.\n */\n async getWeightedCards(_limit) {\n throw new Error(\n \"HierarchyDefinitionNavigator is a filter and should not be used as a generator. Use Pipeline with a generator and this filter via transform().\"\n );\n }\n };\n }\n});\n\n// src/core/navigators/filters/userTagPreference.ts\nvar userTagPreference_exports = {};\n__export(userTagPreference_exports, {\n default: () => UserTagPreferenceFilter\n});\nvar UserTagPreferenceFilter;\nvar init_userTagPreference = __esm({\n \"src/core/navigators/filters/userTagPreference.ts\"() {\n \"use strict\";\n init_navigators();\n UserTagPreferenceFilter = class extends ContentNavigator {\n _strategyData;\n /** Human-readable name for CardFilter interface */\n name;\n constructor(user, course, strategyData) {\n super(user, course, strategyData);\n this._strategyData = strategyData;\n this.name = strategyData.name || \"User Tag Preferences\";\n }\n /**\n * Compute multiplier for a card based on its tags and user preferences.\n * Returns the maximum multiplier among all matching tags, or 1.0 if no matches.\n */\n computeMultiplier(cardTags, boostMap) {\n const multipliers = cardTags.map((tag) => boostMap[tag]).filter((val) => val !== void 0);\n if (multipliers.length === 0) {\n return 1;\n }\n return Math.max(...multipliers);\n }\n /**\n * Build human-readable reason for the filter's decision.\n */\n buildReason(cardTags, boostMap, multiplier) {\n const matchingTags = cardTags.filter((tag) => boostMap[tag] === multiplier);\n if (multiplier === 0) {\n return `Excluded by user preference: ${matchingTags.join(\", \")} (${multiplier}x)`;\n }\n if (multiplier < 1) {\n return `Penalized by user preference: ${matchingTags.join(\", \")} (${multiplier.toFixed(2)}x)`;\n }\n if (multiplier > 1) {\n return `Boosted by user preference: ${matchingTags.join(\", \")} (${multiplier.toFixed(2)}x)`;\n }\n return \"No matching user preferences\";\n }\n /**\n * CardFilter.transform implementation.\n *\n * Apply user tag preferences:\n * 1. Read preferences from strategy state\n * 2. If no preferences, pass through unchanged\n * 3. For each card:\n * - Look up tag in boost record\n * - If tag found: apply multiplier (0 = exclude, 1 = neutral, >1 = boost)\n * - If multiple tags match: use max multiplier\n * - Append provenance with clear reason\n */\n async transform(cards, _context) {\n const prefs = await this.getStrategyState();\n if (!prefs || Object.keys(prefs.boost).length === 0) {\n return cards.map((card) => ({\n ...card,\n provenance: [\n ...card.provenance,\n {\n strategy: \"userTagPreference\",\n strategyName: this.strategyName || this.name,\n strategyId: this.strategyId || this._strategyData._id,\n action: \"passed\",\n score: card.score,\n reason: \"No user tag preferences configured\"\n }\n ]\n }));\n }\n const adjusted = await Promise.all(\n cards.map(async (card) => {\n const cardTags = card.tags ?? [];\n const multiplier = this.computeMultiplier(cardTags, prefs.boost);\n const finalScore = Math.min(1, card.score * multiplier);\n let action;\n if (multiplier === 0 || multiplier < 1) {\n action = \"penalized\";\n } else if (multiplier > 1) {\n action = \"boosted\";\n } else {\n action = \"passed\";\n }\n return {\n ...card,\n score: finalScore,\n provenance: [\n ...card.provenance,\n {\n strategy: \"userTagPreference\",\n strategyName: this.strategyName || this.name,\n strategyId: this.strategyId || this._strategyData._id,\n action,\n score: finalScore,\n reason: this.buildReason(cardTags, prefs.boost, multiplier)\n }\n ]\n };\n })\n );\n return adjusted;\n }\n /**\n * Legacy getWeightedCards - throws as filters should not be used as generators.\n */\n async getWeightedCards(_limit) {\n throw new Error(\n \"UserTagPreferenceFilter is a filter and should not be used as a generator. Use Pipeline with a generator and this filter via transform().\"\n );\n }\n };\n }\n});\n\n// src/core/navigators/filters/index.ts\nvar filters_exports = {};\n__export(filters_exports, {\n UserTagPreferenceFilter: () => UserTagPreferenceFilter,\n createEloDistanceFilter: () => createEloDistanceFilter\n});\nvar init_filters = __esm({\n \"src/core/navigators/filters/index.ts\"() {\n \"use strict\";\n init_eloDistance();\n init_userTagPreference();\n }\n});\n\n// src/core/navigators/filters/inferredPreferenceStub.ts\nvar inferredPreferenceStub_exports = {};\n__export(inferredPreferenceStub_exports, {\n INFERRED_PREFERENCE_NAVIGATOR_STUB: () => INFERRED_PREFERENCE_NAVIGATOR_STUB\n});\nvar INFERRED_PREFERENCE_NAVIGATOR_STUB;\nvar init_inferredPreferenceStub = __esm({\n \"src/core/navigators/filters/inferredPreferenceStub.ts\"() {\n \"use strict\";\n INFERRED_PREFERENCE_NAVIGATOR_STUB = true;\n }\n});\n\n// src/core/navigators/filters/interferenceMitigator.ts\nvar interferenceMitigator_exports = {};\n__export(interferenceMitigator_exports, {\n default: () => InterferenceMitigatorNavigator\n});\nimport { toCourseElo as toCourseElo4 } from \"@vue-skuilder/common\";\nvar DEFAULT_MIN_COUNT3, DEFAULT_MIN_ELAPSED_DAYS, DEFAULT_INTERFERENCE_DECAY, InterferenceMitigatorNavigator;\nvar init_interferenceMitigator = __esm({\n \"src/core/navigators/filters/interferenceMitigator.ts\"() {\n \"use strict\";\n init_navigators();\n DEFAULT_MIN_COUNT3 = 10;\n DEFAULT_MIN_ELAPSED_DAYS = 3;\n DEFAULT_INTERFERENCE_DECAY = 0.8;\n InterferenceMitigatorNavigator = class extends ContentNavigator {\n config;\n /** Human-readable name for CardFilter interface */\n name;\n /** Precomputed map: tag -> set of { partner, decay } it interferes with */\n interferenceMap;\n constructor(user, course, strategyData) {\n super(user, course, strategyData);\n this.config = this.parseConfig(strategyData.serializedData);\n this.interferenceMap = this.buildInterferenceMap();\n this.name = strategyData.name || \"Interference Mitigator\";\n }\n parseConfig(serializedData) {\n try {\n const parsed = JSON.parse(serializedData);\n let sets = parsed.interferenceSets || [];\n if (sets.length > 0 && Array.isArray(sets[0])) {\n sets = sets.map((tags) => ({ tags }));\n }\n return {\n interferenceSets: sets,\n maturityThreshold: {\n minCount: parsed.maturityThreshold?.minCount ?? DEFAULT_MIN_COUNT3,\n minElo: parsed.maturityThreshold?.minElo,\n minElapsedDays: parsed.maturityThreshold?.minElapsedDays ?? DEFAULT_MIN_ELAPSED_DAYS\n },\n defaultDecay: parsed.defaultDecay ?? DEFAULT_INTERFERENCE_DECAY\n };\n } catch {\n return {\n interferenceSets: [],\n maturityThreshold: {\n minCount: DEFAULT_MIN_COUNT3,\n minElapsedDays: DEFAULT_MIN_ELAPSED_DAYS\n },\n defaultDecay: DEFAULT_INTERFERENCE_DECAY\n };\n }\n }\n /**\n * Build a map from each tag to its interference partners with decay coefficients.\n * If tags A, B, C are in an interference group with decay 0.8, then:\n * - A interferes with B (decay 0.8) and C (decay 0.8)\n * - B interferes with A (decay 0.8) and C (decay 0.8)\n * - etc.\n */\n buildInterferenceMap() {\n const map = /* @__PURE__ */ new Map();\n for (const group of this.config.interferenceSets) {\n const decay = group.decay ?? this.config.defaultDecay ?? DEFAULT_INTERFERENCE_DECAY;\n for (const tag of group.tags) {\n if (!map.has(tag)) {\n map.set(tag, []);\n }\n const partners = map.get(tag);\n for (const other of group.tags) {\n if (other !== tag) {\n const existing = partners.find((p) => p.partner === other);\n if (existing) {\n existing.decay = Math.max(existing.decay, decay);\n } else {\n partners.push({ partner: other, decay });\n }\n }\n }\n }\n }\n return map;\n }\n /**\n * Get the set of tags that are currently immature for this user.\n * A tag is immature if the user has interacted with it but hasn't\n * reached the maturity threshold.\n */\n async getImmatureTags(context) {\n const immature = /* @__PURE__ */ new Set();\n try {\n const courseReg = await context.user.getCourseRegDoc(context.course.getCourseID());\n const userElo = toCourseElo4(courseReg.elo);\n const minCount = this.config.maturityThreshold?.minCount ?? DEFAULT_MIN_COUNT3;\n const minElo = this.config.maturityThreshold?.minElo;\n const minElapsedDays = this.config.maturityThreshold?.minElapsedDays ?? DEFAULT_MIN_ELAPSED_DAYS;\n const minCountForElapsed = minElapsedDays * 2;\n for (const [tagId, tagElo] of Object.entries(userElo.tags)) {\n if (tagElo.count === 0) continue;\n const belowCount = tagElo.count < minCount;\n const belowElo = minElo !== void 0 && tagElo.score < minElo;\n const belowElapsed = tagElo.count < minCountForElapsed;\n if (belowCount || belowElo || belowElapsed) {\n immature.add(tagId);\n }\n }\n } catch {\n }\n return immature;\n }\n /**\n * Get all tags that interfere with any immature tag, along with their decay coefficients.\n * These are the tags we want to avoid introducing.\n */\n getTagsToAvoid(immatureTags) {\n const avoid = /* @__PURE__ */ new Map();\n for (const immatureTag of immatureTags) {\n const partners = this.interferenceMap.get(immatureTag);\n if (partners) {\n for (const { partner, decay } of partners) {\n if (!immatureTags.has(partner)) {\n const existing = avoid.get(partner) ?? 0;\n avoid.set(partner, Math.max(existing, decay));\n }\n }\n }\n }\n return avoid;\n }\n /**\n * Compute interference score reduction for a card.\n * Returns: { multiplier, interfering tags, reason }\n */\n computeInterferenceEffect(cardTags, tagsToAvoid, immatureTags) {\n if (tagsToAvoid.size === 0) {\n return {\n multiplier: 1,\n interferingTags: [],\n reason: \"No interference detected\"\n };\n }\n let multiplier = 1;\n const interferingTags = [];\n for (const tag of cardTags) {\n const decay = tagsToAvoid.get(tag);\n if (decay !== void 0) {\n interferingTags.push(tag);\n multiplier *= 1 - decay;\n }\n }\n if (interferingTags.length === 0) {\n return {\n multiplier: 1,\n interferingTags: [],\n reason: \"No interference detected\"\n };\n }\n const causingTags = /* @__PURE__ */ new Set();\n for (const tag of interferingTags) {\n for (const immatureTag of immatureTags) {\n const partners = this.interferenceMap.get(immatureTag);\n if (partners?.some((p) => p.partner === tag)) {\n causingTags.add(immatureTag);\n }\n }\n }\n const reason = `Interferes with immature tags ${Array.from(causingTags).join(\", \")} (tags: ${interferingTags.join(\", \")}, multiplier: ${multiplier.toFixed(2)})`;\n return { multiplier, interferingTags, reason };\n }\n /**\n * CardFilter.transform implementation.\n *\n * Apply interference-aware scoring. Cards with tags that interfere with\n * immature learnings get reduced scores.\n */\n async transform(cards, context) {\n const immatureTags = await this.getImmatureTags(context);\n const tagsToAvoid = this.getTagsToAvoid(immatureTags);\n const adjusted = [];\n for (const card of cards) {\n const cardTags = card.tags ?? [];\n const { multiplier, reason } = this.computeInterferenceEffect(\n cardTags,\n tagsToAvoid,\n immatureTags\n );\n const finalScore = card.score * multiplier;\n const action = multiplier < 1 ? \"penalized\" : multiplier > 1 ? \"boosted\" : \"passed\";\n adjusted.push({\n ...card,\n score: finalScore,\n provenance: [\n ...card.provenance,\n {\n strategy: \"interferenceMitigator\",\n strategyName: this.strategyName || this.name,\n strategyId: this.strategyId || \"NAVIGATION_STRATEGY-interference\",\n action,\n score: finalScore,\n reason\n }\n ]\n });\n }\n return adjusted;\n }\n /**\n * Legacy getWeightedCards - now throws as filters should not be used as generators.\n *\n * Use transform() via Pipeline instead.\n */\n async getWeightedCards(_limit) {\n throw new Error(\n \"InterferenceMitigatorNavigator is a filter and should not be used as a generator. Use Pipeline with a generator and this filter via transform().\"\n );\n }\n };\n }\n});\n\n// src/core/navigators/filters/relativePriority.ts\nvar relativePriority_exports = {};\n__export(relativePriority_exports, {\n default: () => RelativePriorityNavigator\n});\nvar DEFAULT_PRIORITY, DEFAULT_PRIORITY_INFLUENCE, DEFAULT_COMBINE_MODE, RelativePriorityNavigator;\nvar init_relativePriority = __esm({\n \"src/core/navigators/filters/relativePriority.ts\"() {\n \"use strict\";\n init_navigators();\n DEFAULT_PRIORITY = 0.5;\n DEFAULT_PRIORITY_INFLUENCE = 0.5;\n DEFAULT_COMBINE_MODE = \"max\";\n RelativePriorityNavigator = class extends ContentNavigator {\n config;\n /** Human-readable name for CardFilter interface */\n name;\n constructor(user, course, strategyData) {\n super(user, course, strategyData);\n this.config = this.parseConfig(strategyData.serializedData);\n this.name = strategyData.name || \"Relative Priority\";\n }\n parseConfig(serializedData) {\n try {\n const parsed = JSON.parse(serializedData);\n return {\n tagPriorities: parsed.tagPriorities || {},\n defaultPriority: parsed.defaultPriority ?? DEFAULT_PRIORITY,\n combineMode: parsed.combineMode ?? DEFAULT_COMBINE_MODE,\n priorityInfluence: parsed.priorityInfluence ?? DEFAULT_PRIORITY_INFLUENCE\n };\n } catch {\n return {\n tagPriorities: {},\n defaultPriority: DEFAULT_PRIORITY,\n combineMode: DEFAULT_COMBINE_MODE,\n priorityInfluence: DEFAULT_PRIORITY_INFLUENCE\n };\n }\n }\n /**\n * Look up the priority for a tag.\n */\n getTagPriority(tagId) {\n return this.config.tagPriorities[tagId] ?? this.config.defaultPriority ?? DEFAULT_PRIORITY;\n }\n /**\n * Compute combined priority for a card based on its tags.\n */\n computeCardPriority(cardTags) {\n if (cardTags.length === 0) {\n return this.config.defaultPriority ?? DEFAULT_PRIORITY;\n }\n const priorities = cardTags.map((tag) => this.getTagPriority(tag));\n switch (this.config.combineMode) {\n case \"max\":\n return Math.max(...priorities);\n case \"min\":\n return Math.min(...priorities);\n case \"average\":\n return priorities.reduce((sum, p) => sum + p, 0) / priorities.length;\n default:\n return Math.max(...priorities);\n }\n }\n /**\n * Compute boost factor based on priority.\n *\n * The formula: 1 + (priority - 0.5) * priorityInfluence\n *\n * This creates a multiplier centered around 1.0:\n * - Priority 1.0 with influence 0.5 → 1.25 (25% boost)\n * - Priority 0.5 with any influence → 1.00 (neutral)\n * - Priority 0.0 with influence 0.5 → 0.75 (25% reduction)\n */\n computeBoostFactor(priority) {\n const influence = this.config.priorityInfluence ?? DEFAULT_PRIORITY_INFLUENCE;\n return 1 + (priority - 0.5) * influence;\n }\n /**\n * Build human-readable reason for priority adjustment.\n */\n buildPriorityReason(cardTags, priority, boostFactor, finalScore) {\n if (cardTags.length === 0) {\n return `No tags, neutral priority (${priority.toFixed(2)})`;\n }\n const tagList = cardTags.slice(0, 3).join(\", \");\n const more = cardTags.length > 3 ? ` (+${cardTags.length - 3} more)` : \"\";\n if (boostFactor === 1) {\n return `Neutral priority (${priority.toFixed(2)}) for tags: ${tagList}${more}`;\n } else if (boostFactor > 1) {\n return `High-priority tags: ${tagList}${more} (priority ${priority.toFixed(2)} \\u2192 boost ${boostFactor.toFixed(2)}x \\u2192 ${finalScore.toFixed(2)})`;\n } else {\n return `Low-priority tags: ${tagList}${more} (priority ${priority.toFixed(2)} \\u2192 reduce ${boostFactor.toFixed(2)}x \\u2192 ${finalScore.toFixed(2)})`;\n }\n }\n /**\n * CardFilter.transform implementation.\n *\n * Apply priority-adjusted scoring. Cards with high-priority tags get boosted,\n * cards with low-priority tags get reduced scores.\n */\n async transform(cards, _context) {\n const adjusted = await Promise.all(\n cards.map(async (card) => {\n const cardTags = card.tags ?? [];\n const priority = this.computeCardPriority(cardTags);\n const boostFactor = this.computeBoostFactor(priority);\n const finalScore = Math.max(0, card.score * boostFactor);\n const action = boostFactor > 1 ? \"boosted\" : boostFactor < 1 ? \"penalized\" : \"passed\";\n const reason = this.buildPriorityReason(cardTags, priority, boostFactor, finalScore);\n return {\n ...card,\n score: finalScore,\n provenance: [\n ...card.provenance,\n {\n strategy: \"relativePriority\",\n strategyName: this.strategyName || this.name,\n strategyId: this.strategyId || \"NAVIGATION_STRATEGY-priority\",\n action,\n score: finalScore,\n reason\n }\n ]\n };\n })\n );\n return adjusted;\n }\n /**\n * Legacy getWeightedCards - now throws as filters should not be used as generators.\n *\n * Use transform() via Pipeline instead.\n */\n async getWeightedCards(_limit) {\n throw new Error(\n \"RelativePriorityNavigator is a filter and should not be used as a generator. Use Pipeline with a generator and this filter via transform().\"\n );\n }\n };\n }\n});\n\n// src/core/navigators/filters/types.ts\nvar types_exports2 = {};\nvar init_types2 = __esm({\n \"src/core/navigators/filters/types.ts\"() {\n \"use strict\";\n }\n});\n\n// src/core/navigators/filters/userGoalStub.ts\nvar userGoalStub_exports = {};\n__export(userGoalStub_exports, {\n USER_GOAL_NAVIGATOR_STUB: () => USER_GOAL_NAVIGATOR_STUB\n});\nvar USER_GOAL_NAVIGATOR_STUB;\nvar init_userGoalStub = __esm({\n \"src/core/navigators/filters/userGoalStub.ts\"() {\n \"use strict\";\n USER_GOAL_NAVIGATOR_STUB = true;\n }\n});\n\n// import(\"./filters/**/*\") in src/core/navigators/index.ts\nvar globImport_filters;\nvar init_2 = __esm({\n 'import(\"./filters/**/*\") in src/core/navigators/index.ts'() {\n globImport_filters = __glob({\n \"./filters/WeightedFilter.ts\": () => Promise.resolve().then(() => (init_WeightedFilter(), WeightedFilter_exports)),\n \"./filters/eloDistance.ts\": () => Promise.resolve().then(() => (init_eloDistance(), eloDistance_exports)),\n \"./filters/hierarchyDefinition.ts\": () => Promise.resolve().then(() => (init_hierarchyDefinition(), hierarchyDefinition_exports)),\n \"./filters/index.ts\": () => Promise.resolve().then(() => (init_filters(), filters_exports)),\n \"./filters/inferredPreferenceStub.ts\": () => Promise.resolve().then(() => (init_inferredPreferenceStub(), inferredPreferenceStub_exports)),\n \"./filters/interferenceMitigator.ts\": () => Promise.resolve().then(() => (init_interferenceMitigator(), interferenceMitigator_exports)),\n \"./filters/relativePriority.ts\": () => Promise.resolve().then(() => (init_relativePriority(), relativePriority_exports)),\n \"./filters/types.ts\": () => Promise.resolve().then(() => (init_types2(), types_exports2)),\n \"./filters/userGoalStub.ts\": () => Promise.resolve().then(() => (init_userGoalStub(), userGoalStub_exports)),\n \"./filters/userTagPreference.ts\": () => Promise.resolve().then(() => (init_userTagPreference(), userTagPreference_exports))\n });\n }\n});\n\n// src/core/orchestration/gradient.ts\nfunction aggregateOutcomesForGradient(outcomes, strategyId) {\n const observations = [];\n for (const outcome of outcomes) {\n const deviation = outcome.deviations[strategyId];\n if (deviation === void 0) {\n continue;\n }\n observations.push({\n deviation,\n outcomeValue: outcome.outcomeValue,\n weight: 1\n });\n }\n logger.debug(\n `[Orchestration] Aggregated ${observations.length} observations for strategy ${strategyId}`\n );\n return observations;\n}\nfunction computeStrategyGradient(observations) {\n const n = observations.length;\n if (n < 3) {\n logger.debug(`[Orchestration] Insufficient observations for gradient (${n} < 3)`);\n return null;\n }\n let sumX = 0;\n let sumY = 0;\n let sumW = 0;\n for (const obs of observations) {\n const w = obs.weight ?? 1;\n sumX += obs.deviation * w;\n sumY += obs.outcomeValue * w;\n sumW += w;\n }\n const meanX = sumX / sumW;\n const meanY = sumY / sumW;\n let numerator = 0;\n let denominator = 0;\n let ssTotal = 0;\n for (const obs of observations) {\n const w = obs.weight ?? 1;\n const dx = obs.deviation - meanX;\n const dy = obs.outcomeValue - meanY;\n numerator += w * dx * dy;\n denominator += w * dx * dx;\n ssTotal += w * dy * dy;\n }\n if (denominator < 1e-10) {\n logger.debug(`[Orchestration] No variance in deviations, cannot compute gradient`);\n return {\n gradient: 0,\n intercept: meanY,\n rSquared: 0,\n sampleSize: n\n };\n }\n const gradient = numerator / denominator;\n const intercept = meanY - gradient * meanX;\n let ssResidual = 0;\n for (const obs of observations) {\n const w = obs.weight ?? 1;\n const predicted = gradient * obs.deviation + intercept;\n const residual = obs.outcomeValue - predicted;\n ssResidual += w * residual * residual;\n }\n const rSquared = ssTotal > 1e-10 ? 1 - ssResidual / ssTotal : 0;\n logger.debug(\n `[Orchestration] Computed gradient: ${gradient.toFixed(4)}, intercept: ${intercept.toFixed(4)}, R\\xB2: ${rSquared.toFixed(4)}, n=${n}`\n );\n return {\n gradient,\n intercept,\n rSquared: Math.max(0, Math.min(1, rSquared)),\n // Clamp to [0,1]\n sampleSize: n\n };\n}\nvar init_gradient = __esm({\n \"src/core/orchestration/gradient.ts\"() {\n \"use strict\";\n init_logger();\n }\n});\n\n// src/core/orchestration/learning.ts\nfunction updateStrategyWeight(current, gradient) {\n if (gradient.sampleSize < MIN_OBSERVATIONS_FOR_UPDATE) {\n logger.debug(\n `[Orchestration] Insufficient samples (${gradient.sampleSize} < ${MIN_OBSERVATIONS_FOR_UPDATE}), keeping current weight`\n );\n return {\n ...current,\n sampleSize: current.sampleSize + gradient.sampleSize\n };\n }\n const isReliable = gradient.rSquared >= MIN_R_SQUARED_FOR_GRADIENT;\n const isFlat = Math.abs(gradient.gradient) < FLAT_GRADIENT_THRESHOLD;\n let newWeight = current.weight;\n let newConfidence = current.confidence;\n if (!isReliable || isFlat) {\n const confidenceGain = 0.05 * (1 - current.confidence);\n newConfidence = Math.min(1, current.confidence + confidenceGain);\n logger.debug(\n `[Orchestration] Flat/unreliable gradient (|g|=${Math.abs(gradient.gradient).toFixed(4)}, R\\xB2=${gradient.rSquared.toFixed(4)}). Increasing confidence: ${current.confidence.toFixed(3)} \\u2192 ${newConfidence.toFixed(3)}`\n );\n } else {\n let delta = gradient.gradient * LEARNING_RATE;\n delta = Math.max(-MAX_WEIGHT_DELTA, Math.min(MAX_WEIGHT_DELTA, delta));\n newWeight = current.weight + delta;\n newWeight = Math.max(0.1, Math.min(3, newWeight));\n const confidenceGain = 0.02 * (1 - current.confidence);\n newConfidence = Math.min(1, current.confidence + confidenceGain);\n logger.debug(\n `[Orchestration] Adjusting weight: ${current.weight.toFixed(3)} \\u2192 ${newWeight.toFixed(3)} (gradient=${gradient.gradient.toFixed(4)}, delta=${delta.toFixed(4)})`\n );\n }\n return {\n weight: newWeight,\n confidence: newConfidence,\n sampleSize: current.sampleSize + gradient.sampleSize\n };\n}\nfunction updateLearningState(courseId, strategyId, currentWeight, gradient, existing) {\n const now = (/* @__PURE__ */ new Date()).toISOString();\n const id = `STRATEGY_LEARNING_STATE::${courseId}::${strategyId}`;\n const historyEntry = {\n timestamp: now,\n weight: currentWeight.weight,\n confidence: currentWeight.confidence,\n gradient: gradient.gradient\n };\n let history = existing?.history ?? [];\n history = [...history, historyEntry];\n if (history.length > MAX_HISTORY_LENGTH) {\n history = history.slice(history.length - MAX_HISTORY_LENGTH);\n }\n const state = {\n _id: id,\n _rev: existing?._rev,\n docType: \"STRATEGY_LEARNING_STATE\" /* STRATEGY_LEARNING_STATE */,\n courseId,\n strategyId,\n currentWeight,\n regression: {\n gradient: gradient.gradient,\n intercept: gradient.intercept,\n rSquared: gradient.rSquared,\n sampleSize: gradient.sampleSize,\n computedAt: now\n },\n history,\n updatedAt: now\n };\n return state;\n}\nfunction runPeriodUpdate(input) {\n const { courseId, strategyId, currentWeight, gradient, existingState } = input;\n logger.info(\n `[Orchestration] Running period update for strategy ${strategyId} (${gradient.sampleSize} observations)`\n );\n const newWeight = updateStrategyWeight(currentWeight, gradient);\n const updated = newWeight.weight !== currentWeight.weight;\n const learningState = updateLearningState(\n courseId,\n strategyId,\n newWeight,\n gradient,\n existingState\n );\n logger.info(\n `[Orchestration] Period update complete for ${strategyId}: weight ${currentWeight.weight.toFixed(3)} \\u2192 ${newWeight.weight.toFixed(3)}, confidence ${currentWeight.confidence.toFixed(3)} \\u2192 ${newWeight.confidence.toFixed(3)}`\n );\n return {\n strategyId,\n previousWeight: currentWeight,\n newWeight,\n gradient,\n learningState,\n updated\n };\n}\nfunction getDefaultLearnableWeight() {\n return { ...DEFAULT_LEARNABLE_WEIGHT };\n}\nvar MIN_OBSERVATIONS_FOR_UPDATE, LEARNING_RATE, MAX_WEIGHT_DELTA, MIN_R_SQUARED_FOR_GRADIENT, FLAT_GRADIENT_THRESHOLD, MAX_HISTORY_LENGTH;\nvar init_learning = __esm({\n \"src/core/orchestration/learning.ts\"() {\n \"use strict\";\n init_contentNavigationStrategy();\n init_types_legacy();\n init_logger();\n MIN_OBSERVATIONS_FOR_UPDATE = 10;\n LEARNING_RATE = 0.1;\n MAX_WEIGHT_DELTA = 0.3;\n MIN_R_SQUARED_FOR_GRADIENT = 0.05;\n FLAT_GRADIENT_THRESHOLD = 0.02;\n MAX_HISTORY_LENGTH = 100;\n }\n});\n\n// src/core/orchestration/signal.ts\nfunction computeOutcomeSignal(records, config = {}) {\n if (!records || records.length === 0) {\n return null;\n }\n const target = config.targetAccuracy ?? 0.85;\n const tolerance = config.tolerance ?? 0.05;\n let correct = 0;\n for (const r of records) {\n if (r.isCorrect) correct++;\n }\n const accuracy = correct / records.length;\n return scoreAccuracyInZone(accuracy, target, tolerance);\n}\nfunction scoreAccuracyInZone(accuracy, target, tolerance) {\n const dist = Math.abs(accuracy - target);\n if (dist <= tolerance) {\n return 1;\n }\n const excess = dist - tolerance;\n const slope = 2.5;\n return Math.max(0, 1 - excess * slope);\n}\nvar init_signal = __esm({\n \"src/core/orchestration/signal.ts\"() {\n \"use strict\";\n }\n});\n\n// src/core/orchestration/recording.ts\nasync function recordUserOutcome(context, periodStart, periodEnd, records, activeStrategyIds, eloStart = 0, eloEnd = 0, config) {\n const { user, course, userId } = context;\n const courseId = course.getCourseID();\n const outcomeValue = computeOutcomeSignal(records, config);\n if (outcomeValue === null) {\n logger.debug(\n `[Orchestration] No outcome signal computed for ${userId} (insufficient data). Skipping record.`\n );\n return;\n }\n const deviations = {};\n for (const strategyId of activeStrategyIds) {\n deviations[strategyId] = context.getDeviation(strategyId);\n }\n const id = `USER_OUTCOME::${courseId}::${userId}::${periodEnd}`;\n const record = {\n _id: id,\n docType: \"USER_OUTCOME\" /* USER_OUTCOME */,\n courseId,\n userId,\n periodStart,\n periodEnd,\n outcomeValue,\n deviations,\n metadata: {\n sessionsCount: 1,\n // Assumes recording is triggered per-session currently\n cardsSeen: records.length,\n eloStart,\n eloEnd,\n signalType: \"accuracy_in_zone\"\n }\n };\n try {\n await user.putUserOutcome(record);\n logger.debug(\n `[Orchestration] Recorded outcome ${outcomeValue.toFixed(3)} for ${userId} (doc: ${id})`\n );\n } catch (e) {\n logger.error(`[Orchestration] Failed to record outcome: ${e}`);\n }\n}\nvar init_recording = __esm({\n \"src/core/orchestration/recording.ts\"() {\n \"use strict\";\n init_signal();\n init_types_legacy();\n init_logger();\n }\n});\n\n// src/core/orchestration/index.ts\nfunction fnv1a(str) {\n let hash = 2166136261;\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\nfunction computeDeviation(userId, strategyId, salt) {\n const input = `${userId}:${strategyId}:${salt}`;\n const hash = fnv1a(input);\n const normalized = hash / 4294967296;\n return normalized * 2 - 1;\n}\nfunction computeSpread(confidence) {\n const clampedConfidence = Math.max(0, Math.min(1, confidence));\n return MAX_SPREAD - clampedConfidence * (MAX_SPREAD - MIN_SPREAD);\n}\nfunction computeEffectiveWeight(learnable, userId, strategyId, salt) {\n const deviation = computeDeviation(userId, strategyId, salt);\n const spread = computeSpread(learnable.confidence);\n const adjustment = deviation * spread * learnable.weight;\n const effective = learnable.weight + adjustment;\n return Math.max(MIN_WEIGHT, Math.min(MAX_WEIGHT, effective));\n}\nasync function createOrchestrationContext(user, course) {\n let courseConfig;\n try {\n courseConfig = await course.getCourseConfig();\n } catch (e) {\n logger.error(`[Orchestration] Failed to load course config: ${e}`);\n courseConfig = {\n name: \"Unknown\",\n description: \"\",\n public: false,\n deleted: false,\n creator: \"\",\n admins: [],\n moderators: [],\n dataShapes: [],\n questionTypes: [],\n orchestration: { salt: \"default\" }\n };\n }\n const userId = user.getUsername();\n const salt = courseConfig.orchestration?.salt || \"default_salt\";\n return {\n user,\n course,\n userId,\n courseConfig,\n getEffectiveWeight(strategyId, learnable) {\n return computeEffectiveWeight(learnable, userId, strategyId, salt);\n },\n getDeviation(strategyId) {\n return computeDeviation(userId, strategyId, salt);\n }\n };\n}\nvar MIN_SPREAD, MAX_SPREAD, MIN_WEIGHT, MAX_WEIGHT;\nvar init_orchestration = __esm({\n \"src/core/orchestration/index.ts\"() {\n \"use strict\";\n init_logger();\n init_gradient();\n init_learning();\n init_signal();\n init_recording();\n MIN_SPREAD = 0.1;\n MAX_SPREAD = 0.5;\n MIN_WEIGHT = 0.1;\n MAX_WEIGHT = 3;\n }\n});\n\n// src/core/navigators/Pipeline.ts\nvar Pipeline_exports = {};\n__export(Pipeline_exports, {\n Pipeline: () => Pipeline\n});\nimport { toCourseElo as toCourseElo5 } from \"@vue-skuilder/common\";\nfunction globToRegex(pattern) {\n const escaped = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const withWildcards = escaped.replace(/\\*/g, \".*\");\n return new RegExp(`^${withWildcards}$`);\n}\nfunction globMatch(value, pattern) {\n if (!pattern.includes(\"*\")) return value === pattern;\n return globToRegex(pattern).test(value);\n}\nfunction cardMatchesTagPattern(card, pattern) {\n return (card.tags ?? []).some((tag) => globMatch(tag, pattern));\n}\nfunction mergeHints2(allHints) {\n const defined = allHints.filter((h) => h !== null && h !== void 0);\n if (defined.length === 0) return void 0;\n const merged = {};\n const boostTags = {};\n for (const hints of defined) {\n for (const [pattern, factor] of Object.entries(hints.boostTags ?? {})) {\n boostTags[pattern] = (boostTags[pattern] ?? 1) * factor;\n }\n }\n if (Object.keys(boostTags).length > 0) {\n merged.boostTags = boostTags;\n }\n const boostCards = {};\n for (const hints of defined) {\n for (const [pattern, factor] of Object.entries(hints.boostCards ?? {})) {\n boostCards[pattern] = (boostCards[pattern] ?? 1) * factor;\n }\n }\n if (Object.keys(boostCards).length > 0) {\n merged.boostCards = boostCards;\n }\n const concatUnique = (field) => {\n const values = defined.flatMap((h) => h[field] ?? []);\n if (values.length > 0) {\n merged[field] = [...new Set(values)];\n }\n };\n concatUnique(\"requireTags\");\n concatUnique(\"requireCards\");\n concatUnique(\"excludeTags\");\n concatUnique(\"excludeCards\");\n const labels = defined.map((h) => h._label).filter(Boolean);\n if (labels.length > 0) {\n merged._label = labels.join(\"; \");\n }\n return Object.keys(merged).length > 0 ? merged : void 0;\n}\nfunction logPipelineConfig(generator, filters) {\n const filterList = filters.length > 0 ? \"\\n - \" + filters.map((f) => f.name).join(\"\\n - \") : \" none\";\n logger.info(\n `[Pipeline] Configuration:\n Generator: ${generator.name}\n Filters:${filterList}`\n );\n}\nfunction logTagHydration(cards, tagsByCard) {\n const totalTags = Array.from(tagsByCard.values()).reduce((sum, tags) => sum + tags.length, 0);\n const cardsWithTags = Array.from(tagsByCard.values()).filter((tags) => tags.length > 0).length;\n logger.debug(\n `[Pipeline] Tag hydration: ${cards.length} cards, ${cardsWithTags} have tags (${totalTags} total tags) - single batch query`\n );\n}\nfunction logExecutionSummary(generatorName, generatedCount, filterCount, finalCount, topScores, filterImpacts) {\n const scoreDisplay = topScores.length > 0 ? topScores.map((s) => s.toFixed(2)).join(\", \") : \"none\";\n let filterSummary = \"\";\n if (filterImpacts.length > 0) {\n const impacts = filterImpacts.map((f) => {\n const parts = [];\n if (f.boosted > 0) parts.push(`+${f.boosted}`);\n if (f.penalized > 0) parts.push(`-${f.penalized}`);\n if (f.passed > 0) parts.push(`=${f.passed}`);\n return `${f.name}: ${parts.join(\"/\")}`;\n });\n filterSummary = `\n Filter impact: ${impacts.join(\", \")}`;\n }\n logger.info(\n `[Pipeline] Execution: ${generatorName} produced ${generatedCount} \\u2192 ${filterCount} filters \\u2192 ${finalCount} results (top scores: ${scoreDisplay})` + filterSummary + `\n \\u{1F4A1} Inspect: window.skuilder.pipeline`\n );\n}\nfunction logResultCards(cards) {\n if (!VERBOSE_RESULTS || cards.length === 0) return;\n logger.info(`[Pipeline] Results (${cards.length} cards):`);\n for (let i = 0; i < cards.length; i++) {\n const c = cards[i];\n const tags = c.tags?.slice(0, 3).join(\", \") || \"\";\n const filters = c.provenance.filter((p) => p.strategy === \"hierarchyDefinition\" || p.strategy === \"priorityDefinition\" || p.strategy === \"interferenceFilter\" || p.strategy === \"letterGating\" || p.strategy === \"ephemeralHint\").map((p) => {\n const arrow = p.action === \"boosted\" ? \"\\u2191\" : p.action === \"penalized\" ? \"\\u2193\" : \"=\";\n return `${p.strategyName}${arrow}${p.score.toFixed(2)}`;\n }).join(\" | \");\n logger.info(\n `[Pipeline] ${String(i + 1).padStart(2)}. ${c.score.toFixed(4)} ${c.cardId} [${tags}]${filters ? ` {${filters}}` : \"\"}`\n );\n }\n}\nfunction logCardProvenance(cards, maxCards = 3) {\n const cardsToLog = cards.slice(0, maxCards);\n logger.debug(`[Pipeline] Provenance for top ${cardsToLog.length} cards:`);\n for (const card of cardsToLog) {\n logger.debug(`[Pipeline] ${card.cardId} (final score: ${card.score.toFixed(3)}):`);\n for (const entry of card.provenance) {\n const scoreChange = entry.score.toFixed(3);\n const action = entry.action.padEnd(9);\n logger.debug(\n `[Pipeline] ${action} ${scoreChange} - ${entry.strategyName}: ${entry.reason}`\n );\n }\n }\n}\nvar VERBOSE_RESULTS, Pipeline;\nvar init_Pipeline = __esm({\n \"src/core/navigators/Pipeline.ts\"() {\n \"use strict\";\n init_navigators();\n init_logger();\n init_orchestration();\n init_PipelineDebugger();\n VERBOSE_RESULTS = true;\n Pipeline = class extends ContentNavigator {\n generator;\n filters;\n /**\n * Cached orchestration context. Course config and salt don't change within\n * a page load, so we build the orchestration context once and reuse it on\n * subsequent getWeightedCards() calls (e.g. mid-session replans).\n *\n * This eliminates a remote getCourseConfig() round trip per pipeline run.\n */\n _cachedOrchestration = null;\n /**\n * Persistent tag cache. Maps cardId → tag names.\n *\n * Tags are static within a session (they're set at card generation time),\n * so we cache them across pipeline runs. On replans, many of the same cards\n * reappear — cache hits avoid redundant remote getAppliedTagsBatch() queries.\n */\n _tagCache = /* @__PURE__ */ new Map();\n /**\n * One-shot replan hints. Applied after the filter chain on the next\n * getWeightedCards() call, then cleared.\n */\n _ephemeralHints = null;\n /**\n * Create a new pipeline.\n *\n * @param generator - The generator (or CompositeGenerator) that produces candidates\n * @param filters - Filters to apply sequentially (order doesn't matter for multipliers)\n * @param user - User database interface\n * @param course - Course database interface\n */\n constructor(generator, filters, user, course) {\n super();\n this.generator = generator;\n this.filters = filters;\n this.user = user;\n this.course = course;\n course.getCourseConfig().then((cfg) => {\n logger.debug(`[pipeline] Crated pipeline for ${cfg.name}`);\n }).catch((e) => {\n logger.error(`[pipeline] Failed to lookup courseCfg: ${e}`);\n });\n logPipelineConfig(generator, filters);\n registerPipelineForDebug(this);\n }\n /**\n * Set one-shot hints for the next pipeline run.\n * Consumed after one getWeightedCards() call, then cleared.\n *\n * Overrides ContentNavigator.setEphemeralHints() no-op.\n */\n setEphemeralHints(hints) {\n this._ephemeralHints = hints;\n logger.info(`[Pipeline] Ephemeral hints set: ${JSON.stringify(hints)}`);\n }\n /**\n * Get weighted cards by running generator and applying filters.\n *\n * 1. Build shared context (user ELO, etc.)\n * 2. Get candidates from generator (passing context)\n * 3. Batch hydrate tags for all candidates\n * 4. Apply each filter sequentially\n * 5. Remove zero-score cards\n * 6. Sort by score descending\n * 7. Return top N\n *\n * @param limit - Maximum number of cards to return\n * @returns Cards sorted by score descending\n */\n async getWeightedCards(limit) {\n const t0 = performance.now();\n const context = await this.buildContext();\n const tContext = performance.now();\n const fetchLimit = 500;\n logger.debug(\n `[Pipeline] Fetching ${fetchLimit} candidates from generator '${this.generator.name}'`\n );\n const generatorResult = await this.generator.getWeightedCards(fetchLimit, context);\n let cards = generatorResult.cards;\n const tGenerate = performance.now();\n const generatedCount = cards.length;\n const mergedHints = mergeHints2([this._ephemeralHints, generatorResult.hints]);\n this._ephemeralHints = mergedHints ?? null;\n let generatorSummaries;\n if (this.generator.generators) {\n const genMap = /* @__PURE__ */ new Map();\n for (const card of cards) {\n const firstProv = card.provenance[0];\n if (firstProv) {\n const genName = firstProv.strategyName;\n if (!genMap.has(genName)) {\n genMap.set(genName, { cards: [] });\n }\n genMap.get(genName).cards.push(card);\n }\n }\n generatorSummaries = Array.from(genMap.entries()).map(([name, data]) => {\n const newCards = data.cards.filter((c) => c.provenance[0]?.reason?.includes(\"new card\"));\n const reviewCards = data.cards.filter((c) => c.provenance[0]?.reason?.includes(\"review\"));\n return {\n name,\n cardCount: data.cards.length,\n newCount: newCards.length,\n reviewCount: reviewCards.length,\n topScore: Math.max(...data.cards.map((c) => c.score), 0)\n };\n });\n }\n logger.debug(`[Pipeline] Generator returned ${generatedCount} candidates`);\n cards = await this.hydrateTags(cards);\n const tHydrate = performance.now();\n const allCardsBeforeFiltering = [...cards];\n const pendingHints = this._ephemeralHints;\n if (pendingHints?.requireCards?.length) {\n const poolIds = new Set(allCardsBeforeFiltering.map((c) => c.cardId));\n const missingIds = pendingHints.requireCards.filter(\n (p) => !p.includes(\"*\") && !poolIds.has(p)\n );\n if (missingIds.length > 0) {\n const fetchedTags = await this.course.getAppliedTagsBatch(missingIds);\n const courseId = this.course.getCourseID();\n for (const cardId of missingIds) {\n allCardsBeforeFiltering.push({\n cardId,\n courseId,\n score: 1,\n tags: fetchedTags.get(cardId) ?? [],\n provenance: []\n });\n }\n logger.info(\n `[Pipeline] Pre-fetched ${missingIds.length} required card(s) into pool: ${missingIds.join(\", \")}`\n );\n }\n }\n const prescribedIds = new Set(\n cards.filter((c) => c.provenance.some((p) => p.strategy === \"prescribed\")).map((c) => c.cardId)\n );\n const filterImpacts = [];\n for (const filter of this.filters) {\n const beforeCount = cards.length;\n const beforeScores = new Map(cards.map((c) => [c.cardId, c.score]));\n cards = await filter.transform(cards, context);\n let boosted = 0, penalized = 0, passed = 0;\n const removed = beforeCount - cards.length;\n for (const card of cards) {\n const before = beforeScores.get(card.cardId) ?? 0;\n if (card.score > before) boosted++;\n else if (card.score < before) penalized++;\n else passed++;\n }\n filterImpacts.push({ name: filter.name, boosted, penalized, passed, removed });\n if (prescribedIds.size > 0) {\n const survivingIds = new Set(cards.map((c) => c.cardId));\n const killedPrescribed = [...prescribedIds].filter((id) => !survivingIds.has(id));\n const zeroedPrescribed = cards.filter((c) => prescribedIds.has(c.cardId) && c.score === 0).map((c) => c.cardId);\n if (killedPrescribed.length > 0 || zeroedPrescribed.length > 0) {\n logger.info(\n `[Pipeline] Filter '${filter.name}' impact on prescribed cards: ` + (killedPrescribed.length > 0 ? `removed=[${killedPrescribed.join(\", \")}] ` : \"\") + (zeroedPrescribed.length > 0 ? `zeroed=[${zeroedPrescribed.join(\", \")}]` : \"\")\n );\n killedPrescribed.forEach((id) => prescribedIds.delete(id));\n }\n }\n logger.debug(`[Pipeline] Filter '${filter.name}': ${beforeScores.size} \\u2192 ${cards.length} cards (\\u2191${boosted} \\u2193${penalized} =${passed})`);\n }\n cards = cards.filter((c) => c.score > 0);\n const hints = this._ephemeralHints;\n if (hints) {\n this._ephemeralHints = null;\n cards = this.applyHints(cards, hints, allCardsBeforeFiltering);\n }\n cards.sort((a, b) => b.score - a.score);\n const tFilter = performance.now();\n const result = cards.slice(0, limit);\n logger.info(\n `[Pipeline:timing] total=${(tFilter - t0).toFixed(0)}ms (context=${(tContext - t0).toFixed(0)} generate=${(tGenerate - tContext).toFixed(0)} hydrate=${(tHydrate - tGenerate).toFixed(0)} filter=${(tFilter - tHydrate).toFixed(0)})`\n );\n const topScores = result.slice(0, 3).map((c) => c.score);\n logExecutionSummary(\n this.generator.name,\n generatedCount,\n this.filters.length,\n result.length,\n topScores,\n filterImpacts\n );\n logResultCards(result);\n logCardProvenance(result, 3);\n try {\n const courseName = await this.course?.getCourseConfig().then((c) => c.name).catch(() => void 0);\n const report = buildRunReport(\n this.course?.getCourseID() || \"unknown\",\n courseName,\n this.generator.name,\n generatorSummaries,\n generatedCount,\n filterImpacts,\n cards,\n result,\n context.userElo,\n hints ?? void 0\n );\n captureRun(report);\n } catch (e) {\n logger.debug(`[Pipeline] Failed to capture debug run: ${e}`);\n }\n return { cards: result };\n }\n /**\n * Batch hydrate tags for all cards.\n *\n * Fetches tags for all cards in a single database query and attaches them\n * to the WeightedCard objects. Filters can then use card.tags instead of\n * making individual getAppliedTags() calls.\n *\n * Uses a persistent tag cache across pipeline runs — tags are static within\n * a session, so cards seen in a prior run (e.g. before a replan) don't\n * require a second DB query.\n *\n * @param cards - Cards to hydrate\n * @returns Cards with tags populated\n */\n async hydrateTags(cards) {\n if (cards.length === 0) {\n return cards;\n }\n const uncachedIds = [];\n for (const card of cards) {\n if (!this._tagCache.has(card.cardId)) {\n uncachedIds.push(card.cardId);\n }\n }\n if (uncachedIds.length > 0) {\n const freshTags = await this.course.getAppliedTagsBatch(uncachedIds);\n for (const [cardId, tags] of freshTags) {\n this._tagCache.set(cardId, tags);\n }\n }\n const tagsByCard = /* @__PURE__ */ new Map();\n for (const card of cards) {\n tagsByCard.set(card.cardId, this._tagCache.get(card.cardId) ?? []);\n }\n logTagHydration(cards, tagsByCard);\n return cards.map((card) => ({\n ...card,\n tags: this._tagCache.get(card.cardId) ?? []\n }));\n }\n // ---------------------------------------------------------------------------\n // Ephemeral hints application\n // ---------------------------------------------------------------------------\n /**\n * Apply one-shot replan hints to the post-filter card set.\n *\n * Order of operations:\n * 1. Exclude (remove unwanted cards)\n * 2. Boost (multiply scores)\n * 3. Require (inject must-have cards from the full pre-filter pool)\n *\n * @param cards - Post-filter cards (score > 0)\n * @param hints - The ephemeral hints to apply\n * @param allCards - Full pre-filter card pool (for require injection)\n */\n applyHints(cards, hints, allCards) {\n const beforeCount = cards.length;\n if (hints.excludeCards?.length) {\n cards = cards.filter(\n (c) => !hints.excludeCards.some((pat) => globMatch(c.cardId, pat))\n );\n }\n if (hints.excludeTags?.length) {\n cards = cards.filter(\n (c) => !hints.excludeTags.some((pat) => cardMatchesTagPattern(c, pat))\n );\n }\n if (hints.boostTags) {\n for (const [pattern, factor] of Object.entries(hints.boostTags)) {\n for (const card of cards) {\n if (cardMatchesTagPattern(card, pattern)) {\n card.score *= factor;\n card.provenance.push({\n strategy: \"ephemeralHint\",\n strategyId: \"ephemeral-hint\",\n strategyName: hints._label ? `Replan Hint (${hints._label})` : \"Replan Hint\",\n action: \"boosted\",\n score: card.score,\n reason: `boostTag ${pattern} \\xD7${factor}`\n });\n }\n }\n }\n }\n if (hints.boostCards) {\n for (const [pattern, factor] of Object.entries(hints.boostCards)) {\n for (const card of cards) {\n if (globMatch(card.cardId, pattern)) {\n card.score *= factor;\n card.provenance.push({\n strategy: \"ephemeralHint\",\n strategyId: \"ephemeral-hint\",\n strategyName: hints._label ? `Replan Hint (${hints._label})` : \"Replan Hint\",\n action: \"boosted\",\n score: card.score,\n reason: `boostCard ${pattern} \\xD7${factor}`\n });\n }\n }\n }\n }\n const cardIds = new Set(cards.map((c) => c.cardId));\n const cardMap = new Map(cards.map((c) => [c.cardId, c]));\n const hintLabel = hints._label ? `Replan Hint (${hints._label})` : \"Replan Hint\";\n const applyRequirement = (card, reason) => {\n const mandatoryScore = Number.POSITIVE_INFINITY;\n const existing = cardMap.get(card.cardId);\n if (existing) {\n if (existing.score < mandatoryScore) {\n existing.score = mandatoryScore;\n existing.provenance.push({\n strategy: \"ephemeralHint\",\n strategyId: \"ephemeral-hint\",\n strategyName: hintLabel,\n action: \"boosted\",\n score: mandatoryScore,\n reason: `${reason} (upgrade to mandatory score)`\n });\n }\n } else {\n cards.push({\n ...card,\n score: mandatoryScore,\n provenance: [\n ...card.provenance,\n {\n strategy: \"ephemeralHint\",\n strategyId: \"ephemeral-hint\",\n strategyName: hintLabel,\n action: \"boosted\",\n score: mandatoryScore,\n reason\n }\n ]\n });\n cardIds.add(card.cardId);\n cardMap.set(card.cardId, cards[cards.length - 1]);\n }\n };\n if (hints.requireCards?.length) {\n for (const pattern of hints.requireCards) {\n for (const cardId of cardIds) {\n if (globMatch(cardId, pattern)) {\n applyRequirement(cardMap.get(cardId), `requireCard ${pattern}`);\n }\n }\n for (const card of allCards) {\n if (globMatch(card.cardId, pattern)) {\n applyRequirement(card, `requireCard ${pattern}`);\n }\n }\n }\n }\n if (hints.requireTags?.length) {\n for (const pattern of hints.requireTags) {\n for (const cardId of cardIds) {\n const card = cardMap.get(cardId);\n if (cardMatchesTagPattern(card, pattern)) {\n applyRequirement(card, `requireTag ${pattern}`);\n }\n }\n for (const card of allCards) {\n if (cardMatchesTagPattern(card, pattern)) {\n applyRequirement(card, `requireTag ${pattern}`);\n }\n }\n }\n }\n logger.info(`[Pipeline] Hints applied: ${beforeCount} \\u2192 ${cards.length} cards`);\n return cards;\n }\n /**\n * Build shared context for generator and filters.\n *\n * Called once per getWeightedCards() invocation.\n * Contains data that the generator and multiple filters might need.\n *\n * The context satisfies both GeneratorContext and FilterContext interfaces.\n */\n async buildContext() {\n let userElo = 1e3;\n try {\n const courseReg = await this.user.getCourseRegDoc(this.course.getCourseID());\n const courseElo = toCourseElo5(courseReg.elo);\n userElo = courseElo.global.score;\n } catch (e) {\n logger.debug(`[Pipeline] Could not get user ELO, using default: ${e}`);\n }\n if (!this._cachedOrchestration) {\n this._cachedOrchestration = await createOrchestrationContext(this.user, this.course);\n }\n const orchestration = this._cachedOrchestration;\n return {\n user: this.user,\n course: this.course,\n userElo,\n orchestration\n };\n }\n /**\n * Get the course ID for this pipeline.\n */\n getCourseID() {\n return this.course.getCourseID();\n }\n /**\n * Get orchestration context for outcome recording.\n */\n async getOrchestrationContext() {\n return createOrchestrationContext(this.user, this.course);\n }\n /**\n * Get IDs of all strategies in this pipeline.\n * Used to record which strategies contributed to an outcome.\n */\n getStrategyIds() {\n const ids = [];\n const extractId = (obj) => {\n if (obj.strategyId) return obj.strategyId;\n return null;\n };\n const genId = extractId(this.generator);\n if (genId) ids.push(genId);\n if (this.generator.generators && Array.isArray(this.generator.generators)) {\n this.generator.generators.forEach((g) => {\n const subId = extractId(g);\n if (subId) ids.push(subId);\n });\n }\n for (const filter of this.filters) {\n const fId = extractId(filter);\n if (fId) ids.push(fId);\n }\n return [...new Set(ids)];\n }\n // ---------------------------------------------------------------------------\n // Tag ELO diagnostic\n // ---------------------------------------------------------------------------\n /**\n * Get the user's per-tag ELO data for specified tags (or all tags).\n * Useful for diagnosing why hierarchy gates are open/closed.\n */\n async getTagEloStatus(tagFilter) {\n const courseReg = await this.user.getCourseRegDoc(this.course.getCourseID());\n const courseElo = toCourseElo5(courseReg.elo);\n const result = {};\n if (!tagFilter) {\n for (const [tag, data] of Object.entries(courseElo.tags)) {\n result[tag] = { score: data.score, count: data.count };\n }\n } else {\n const patterns = Array.isArray(tagFilter) ? tagFilter : [tagFilter];\n for (const pattern of patterns) {\n const regex = globToRegex(pattern);\n for (const [tag, data] of Object.entries(courseElo.tags)) {\n if (regex.test(tag)) {\n result[tag] = { score: data.score, count: data.count };\n }\n }\n }\n }\n return result;\n }\n // ---------------------------------------------------------------------------\n // Card-space diagnostic\n // ---------------------------------------------------------------------------\n /**\n * Scan every card in the course through the filter chain and report\n * how many are \"well indicated\" (score >= threshold) for the current user.\n *\n * Also reports how many well-indicated cards the user has NOT yet encountered.\n *\n * Exposed via `window.skuilder.pipeline.diagnoseCardSpace()`.\n */\n async diagnoseCardSpace(opts) {\n const THRESHOLD = opts?.threshold ?? 0.1;\n const t0 = performance.now();\n const allCardIds = await this.course.getAllCardIds();\n let cards = allCardIds.map((cardId) => ({\n cardId,\n courseId: this.course.getCourseID(),\n score: 1,\n provenance: []\n }));\n cards = await this.hydrateTags(cards);\n const context = await this.buildContext();\n const filterBreakdown = [];\n for (const filter of this.filters) {\n cards = await filter.transform(cards, context);\n const wi = cards.filter((c) => c.score >= THRESHOLD).length;\n filterBreakdown.push({ name: filter.name, wellIndicated: wi });\n }\n const wellIndicated = cards.filter((c) => c.score >= THRESHOLD);\n const wellIndicatedIds = new Set(wellIndicated.map((c) => c.cardId));\n let encounteredIds;\n try {\n const courseId = this.course.getCourseID();\n const seenCards = await this.user.getSeenCards(courseId);\n encounteredIds = new Set(seenCards);\n } catch {\n encounteredIds = /* @__PURE__ */ new Set();\n }\n const wellIndicatedNew = wellIndicated.filter((c) => !encounteredIds.has(c.cardId));\n const byType = /* @__PURE__ */ new Map();\n for (const card of cards) {\n const type = card.cardId.split(\"-\")[1] || \"unknown\";\n if (!byType.has(type)) {\n byType.set(type, { total: 0, wellIndicated: 0, new: 0 });\n }\n const entry = byType.get(type);\n entry.total++;\n if (card.score >= THRESHOLD) {\n entry.wellIndicated++;\n if (!encounteredIds.has(card.cardId)) entry.new++;\n }\n }\n const elapsed = performance.now() - t0;\n const result = {\n totalCards: allCardIds.length,\n threshold: THRESHOLD,\n wellIndicated: wellIndicatedIds.size,\n encountered: encounteredIds.size,\n wellIndicatedNew: wellIndicatedNew.length,\n byType: Object.fromEntries(byType),\n filterBreakdown,\n elapsedMs: Math.round(elapsed)\n };\n logger.info(`[Pipeline:diagnose] Card space scan (${result.elapsedMs}ms):`);\n logger.info(`[Pipeline:diagnose] Total cards: ${result.totalCards}`);\n logger.info(`[Pipeline:diagnose] Well-indicated (score >= ${THRESHOLD}): ${result.wellIndicated}`);\n logger.info(`[Pipeline:diagnose] Encountered: ${result.encountered}`);\n logger.info(`[Pipeline:diagnose] Well-indicated & new: ${result.wellIndicatedNew}`);\n logger.info(`[Pipeline:diagnose] By type:`);\n for (const [type, counts] of byType) {\n logger.info(\n `[Pipeline:diagnose] ${type}: ${counts.wellIndicated}/${counts.total} well-indicated, ${counts.new} new`\n );\n }\n logger.info(`[Pipeline:diagnose] After each filter:`);\n for (const fb of filterBreakdown) {\n logger.info(`[Pipeline:diagnose] ${fb.name}: ${fb.wellIndicated} well-indicated`);\n }\n return result;\n }\n };\n }\n});\n\n// src/core/navigators/defaults.ts\nvar defaults_exports = {};\n__export(defaults_exports, {\n createDefaultEloStrategy: () => createDefaultEloStrategy,\n createDefaultPipeline: () => createDefaultPipeline,\n createDefaultSrsStrategy: () => createDefaultSrsStrategy\n});\nfunction createDefaultEloStrategy(courseId) {\n return {\n _id: \"NAVIGATION_STRATEGY-ELO-default\",\n docType: \"NAVIGATION_STRATEGY\" /* NAVIGATION_STRATEGY */,\n name: \"ELO (default)\",\n description: \"Default ELO-based navigation strategy for new cards\",\n implementingClass: \"elo\" /* ELO */,\n course: courseId,\n serializedData: \"\"\n };\n}\nfunction createDefaultSrsStrategy(courseId) {\n return {\n _id: \"NAVIGATION_STRATEGY-SRS-default\",\n docType: \"NAVIGATION_STRATEGY\" /* NAVIGATION_STRATEGY */,\n name: \"SRS (default)\",\n description: \"Default SRS-based navigation strategy for reviews\",\n implementingClass: \"srs\" /* SRS */,\n course: courseId,\n serializedData: \"\"\n };\n}\nfunction createDefaultPipeline(user, course) {\n const courseId = course.getCourseID();\n const eloNavigator = new ELONavigator(user, course, createDefaultEloStrategy(courseId));\n const srsNavigator = new SRSNavigator(user, course, createDefaultSrsStrategy(courseId));\n const compositeGenerator = new CompositeGenerator([eloNavigator, srsNavigator]);\n const eloDistanceFilter = createEloDistanceFilter();\n return new Pipeline(compositeGenerator, [eloDistanceFilter], user, course);\n}\nvar init_defaults = __esm({\n \"src/core/navigators/defaults.ts\"() {\n \"use strict\";\n init_navigators();\n init_Pipeline();\n init_CompositeGenerator();\n init_elo();\n init_srs();\n init_eloDistance();\n init_types_legacy();\n }\n});\n\n// src/core/navigators/PipelineAssembler.ts\nvar PipelineAssembler_exports = {};\n__export(PipelineAssembler_exports, {\n PipelineAssembler: () => PipelineAssembler\n});\nvar PipelineAssembler;\nvar init_PipelineAssembler = __esm({\n \"src/core/navigators/PipelineAssembler.ts\"() {\n \"use strict\";\n init_navigators();\n init_WeightedFilter();\n init_Pipeline();\n init_logger();\n init_CompositeGenerator();\n init_defaults();\n PipelineAssembler = class {\n /**\n * Assembles a navigation pipeline from strategy documents.\n *\n * 1. Separates into generators and filters by role\n * 2. Validates at least one generator exists (or creates default ELO)\n * 3. Instantiates generators - wraps multiple in CompositeGenerator\n * 4. Instantiates filters\n * 5. Returns Pipeline(generator, filters)\n *\n * @param input - Strategy documents plus user/course interfaces\n * @returns Assembled pipeline and any warnings\n */\n async assemble(input) {\n const { strategies, user, course } = input;\n const warnings = [];\n if (strategies.length === 0) {\n return {\n pipeline: null,\n generatorStrategies: [],\n filterStrategies: [],\n warnings\n };\n }\n const generatorStrategies = [];\n const filterStrategies = [];\n for (const s of strategies) {\n if (isGenerator(s.implementingClass)) {\n generatorStrategies.push(s);\n } else if (isFilter(s.implementingClass)) {\n filterStrategies.push(s);\n } else {\n warnings.push(`Unknown strategy type '${s.implementingClass}', skipping: ${s.name}`);\n }\n }\n const courseId = course.getCourseID();\n const hasElo = generatorStrategies.some((s) => s.implementingClass === \"elo\" /* ELO */);\n const hasSrs = generatorStrategies.some((s) => s.implementingClass === \"srs\" /* SRS */);\n if (!hasElo) {\n logger.debug(\"[PipelineAssembler] No ELO generator configured, adding default\");\n generatorStrategies.push(createDefaultEloStrategy(courseId));\n }\n if (!hasSrs) {\n logger.debug(\"[PipelineAssembler] No SRS generator configured, adding default\");\n generatorStrategies.push(createDefaultSrsStrategy(courseId));\n }\n if (generatorStrategies.length === 0) {\n warnings.push(\"No generator strategy found\");\n return {\n pipeline: null,\n generatorStrategies: [],\n filterStrategies: [],\n warnings\n };\n }\n let generator;\n if (generatorStrategies.length === 1) {\n const nav = await ContentNavigator.create(user, course, generatorStrategies[0]);\n generator = nav;\n logger.debug(`[PipelineAssembler] Using single generator: ${generatorStrategies[0].name}`);\n } else {\n logger.debug(\n `[PipelineAssembler] Using CompositeGenerator for ${generatorStrategies.length} generators: ${generatorStrategies.map((g) => g.name).join(\", \")}`\n );\n generator = await CompositeGenerator.fromStrategies(user, course, generatorStrategies);\n }\n const filters = [];\n const sortedFilterStrategies = [...filterStrategies].sort(\n (a, b) => a.name.localeCompare(b.name)\n );\n for (const filterStrategy of sortedFilterStrategies) {\n try {\n const nav = await ContentNavigator.create(user, course, filterStrategy);\n if (\"transform\" in nav && typeof nav.transform === \"function\") {\n let filter = nav;\n if (filterStrategy.learnable) {\n filter = new WeightedFilter(\n filter,\n filterStrategy.learnable,\n filterStrategy.staticWeight,\n filterStrategy._id\n );\n }\n filters.push(filter);\n logger.debug(`[PipelineAssembler] Added filter: ${filterStrategy.name}`);\n } else {\n warnings.push(\n `Filter '${filterStrategy.name}' does not implement CardFilter.transform(), skipping`\n );\n }\n } catch (e) {\n warnings.push(`Failed to instantiate filter '${filterStrategy.name}': ${e}`);\n }\n }\n const pipeline = new Pipeline(generator, filters, user, course);\n logger.debug(\n `[PipelineAssembler] Assembled pipeline with ${generatorStrategies.length} generator(s) and ${filters.length} filter(s)`\n );\n return {\n pipeline,\n generatorStrategies,\n filterStrategies: sortedFilterStrategies,\n warnings\n };\n }\n };\n }\n});\n\n// import(\"./**/*\") in src/core/navigators/index.ts\nvar globImport;\nvar init_3 = __esm({\n 'import(\"./**/*\") in src/core/navigators/index.ts'() {\n globImport = __glob({\n \"./Pipeline.ts\": () => Promise.resolve().then(() => (init_Pipeline(), Pipeline_exports)),\n \"./PipelineAssembler.ts\": () => Promise.resolve().then(() => (init_PipelineAssembler(), PipelineAssembler_exports)),\n \"./PipelineDebugger.ts\": () => Promise.resolve().then(() => (init_PipelineDebugger(), PipelineDebugger_exports)),\n \"./defaults.ts\": () => Promise.resolve().then(() => (init_defaults(), defaults_exports)),\n \"./filters/WeightedFilter.ts\": () => Promise.resolve().then(() => (init_WeightedFilter(), WeightedFilter_exports)),\n \"./filters/eloDistance.ts\": () => Promise.resolve().then(() => (init_eloDistance(), eloDistance_exports)),\n \"./filters/hierarchyDefinition.ts\": () => Promise.resolve().then(() => (init_hierarchyDefinition(), hierarchyDefinition_exports)),\n \"./filters/index.ts\": () => Promise.resolve().then(() => (init_filters(), filters_exports)),\n \"./filters/inferredPreferenceStub.ts\": () => Promise.resolve().then(() => (init_inferredPreferenceStub(), inferredPreferenceStub_exports)),\n \"./filters/interferenceMitigator.ts\": () => Promise.resolve().then(() => (init_interferenceMitigator(), interferenceMitigator_exports)),\n \"./filters/relativePriority.ts\": () => Promise.resolve().then(() => (init_relativePriority(), relativePriority_exports)),\n \"./filters/types.ts\": () => Promise.resolve().then(() => (init_types2(), types_exports2)),\n \"./filters/userGoalStub.ts\": () => Promise.resolve().then(() => (init_userGoalStub(), userGoalStub_exports)),\n \"./filters/userTagPreference.ts\": () => Promise.resolve().then(() => (init_userTagPreference(), userTagPreference_exports)),\n \"./generators/CompositeGenerator.ts\": () => Promise.resolve().then(() => (init_CompositeGenerator(), CompositeGenerator_exports)),\n \"./generators/elo.ts\": () => Promise.resolve().then(() => (init_elo(), elo_exports)),\n \"./generators/index.ts\": () => Promise.resolve().then(() => (init_generators(), generators_exports)),\n \"./generators/prescribed.ts\": () => Promise.resolve().then(() => (init_prescribed(), prescribed_exports)),\n \"./generators/srs.ts\": () => Promise.resolve().then(() => (init_srs(), srs_exports)),\n \"./generators/types.ts\": () => Promise.resolve().then(() => (init_types(), types_exports)),\n \"./index.ts\": () => Promise.resolve().then(() => (init_navigators(), navigators_exports))\n });\n }\n});\n\n// src/core/navigators/index.ts\nvar navigators_exports = {};\n__export(navigators_exports, {\n ContentNavigator: () => ContentNavigator,\n NavigatorRole: () => NavigatorRole,\n NavigatorRoles: () => NavigatorRoles,\n Navigators: () => Navigators,\n getCardOrigin: () => getCardOrigin,\n getRegisteredNavigator: () => getRegisteredNavigator,\n getRegisteredNavigatorNames: () => getRegisteredNavigatorNames,\n getRegisteredNavigatorRole: () => getRegisteredNavigatorRole,\n hasRegisteredNavigator: () => hasRegisteredNavigator,\n initializeNavigatorRegistry: () => initializeNavigatorRegistry,\n isFilter: () => isFilter,\n isGenerator: () => isGenerator,\n mountPipelineDebugger: () => mountPipelineDebugger,\n pipelineDebugAPI: () => pipelineDebugAPI,\n registerNavigator: () => registerNavigator\n});\nfunction registerNavigator(implementingClass, constructor, role) {\n navigatorRegistry.set(implementingClass, { constructor, role });\n logger.debug(`[NavigatorRegistry] Registered: ${implementingClass}${role ? ` (${role})` : \"\"}`);\n}\nfunction getRegisteredNavigator(implementingClass) {\n return navigatorRegistry.get(implementingClass)?.constructor;\n}\nfunction hasRegisteredNavigator(implementingClass) {\n return navigatorRegistry.has(implementingClass);\n}\nfunction getRegisteredNavigatorRole(implementingClass) {\n return navigatorRegistry.get(implementingClass)?.role;\n}\nfunction getRegisteredNavigatorNames() {\n return Array.from(navigatorRegistry.keys());\n}\nasync function initializeNavigatorRegistry() {\n logger.debug(\"[NavigatorRegistry] Initializing built-in navigators...\");\n const [eloModule, srsModule] = await Promise.all([\n Promise.resolve().then(() => (init_elo(), elo_exports)),\n Promise.resolve().then(() => (init_srs(), srs_exports))\n ]);\n const prescribedModule = await Promise.resolve().then(() => (init_prescribed(), prescribed_exports));\n registerNavigator(\"elo\", eloModule.default);\n registerNavigator(\"srs\", srsModule.default);\n registerNavigator(\"prescribed\", prescribedModule.default);\n const [\n hierarchyModule,\n interferenceModule,\n relativePriorityModule,\n userTagPreferenceModule\n ] = await Promise.all([\n Promise.resolve().then(() => (init_hierarchyDefinition(), hierarchyDefinition_exports)),\n Promise.resolve().then(() => (init_interferenceMitigator(), interferenceMitigator_exports)),\n Promise.resolve().then(() => (init_relativePriority(), relativePriority_exports)),\n Promise.resolve().then(() => (init_userTagPreference(), userTagPreference_exports))\n ]);\n registerNavigator(\"hierarchyDefinition\", hierarchyModule.default);\n registerNavigator(\"interferenceMitigator\", interferenceModule.default);\n registerNavigator(\"relativePriority\", relativePriorityModule.default);\n registerNavigator(\"userTagPreference\", userTagPreferenceModule.default);\n logger.debug(\n `[NavigatorRegistry] Initialized ${navigatorRegistry.size} navigators: ${getRegisteredNavigatorNames().join(\", \")}`\n );\n}\nfunction getCardOrigin(card) {\n if (card.provenance.length === 0) {\n throw new Error(\"Card has no provenance - cannot determine origin\");\n }\n const firstEntry = card.provenance[0];\n const reason = firstEntry.reason.toLowerCase();\n if (reason.includes(\"failed\")) {\n return \"failed\";\n }\n if (reason.includes(\"review\")) {\n return \"review\";\n }\n return \"new\";\n}\nfunction isGenerator(impl) {\n if (NavigatorRoles[impl] === \"generator\" /* GENERATOR */) return true;\n return getRegisteredNavigatorRole(impl) === \"generator\" /* GENERATOR */;\n}\nfunction isFilter(impl) {\n if (NavigatorRoles[impl] === \"filter\" /* FILTER */) return true;\n return getRegisteredNavigatorRole(impl) === \"filter\" /* FILTER */;\n}\nvar navigatorRegistry, Navigators, NavigatorRole, NavigatorRoles, ContentNavigator;\nvar init_navigators = __esm({\n \"src/core/navigators/index.ts\"() {\n \"use strict\";\n init_PipelineDebugger();\n init_logger();\n init_();\n init_2();\n init_3();\n navigatorRegistry = /* @__PURE__ */ new Map();\n Navigators = /* @__PURE__ */ ((Navigators2) => {\n Navigators2[\"ELO\"] = \"elo\";\n Navigators2[\"SRS\"] = \"srs\";\n Navigators2[\"PRESCRIBED\"] = \"prescribed\";\n Navigators2[\"HIERARCHY\"] = \"hierarchyDefinition\";\n Navigators2[\"INTERFERENCE\"] = \"interferenceMitigator\";\n Navigators2[\"RELATIVE_PRIORITY\"] = \"relativePriority\";\n Navigators2[\"USER_TAG_PREFERENCE\"] = \"userTagPreference\";\n return Navigators2;\n })(Navigators || {});\n NavigatorRole = /* @__PURE__ */ ((NavigatorRole2) => {\n NavigatorRole2[\"GENERATOR\"] = \"generator\";\n NavigatorRole2[\"FILTER\"] = \"filter\";\n return NavigatorRole2;\n })(NavigatorRole || {});\n NavigatorRoles = {\n [\"elo\" /* ELO */]: \"generator\" /* GENERATOR */,\n [\"srs\" /* SRS */]: \"generator\" /* GENERATOR */,\n [\"prescribed\" /* PRESCRIBED */]: \"generator\" /* GENERATOR */,\n [\"hierarchyDefinition\" /* HIERARCHY */]: \"filter\" /* FILTER */,\n [\"interferenceMitigator\" /* INTERFERENCE */]: \"filter\" /* FILTER */,\n [\"relativePriority\" /* RELATIVE_PRIORITY */]: \"filter\" /* FILTER */,\n [\"userTagPreference\" /* USER_TAG_PREFERENCE */]: \"filter\" /* FILTER */\n };\n ContentNavigator = class {\n /** User interface for this navigation session */\n user;\n /** Course interface for this navigation session */\n course;\n /** Human-readable name for this strategy instance (from ContentNavigationStrategyData.name) */\n strategyName;\n /** Unique document ID for this strategy instance (from ContentNavigationStrategyData._id) */\n strategyId;\n /** Evolutionary weighting configuration */\n learnable;\n /** Whether to bypass deviation (manual/static weighting) */\n staticWeight;\n /**\n * Constructor for standard navigators.\n * Call this from subclass constructors to initialize common fields.\n *\n * Note: CompositeGenerator and Pipeline call super() without args, then set\n * user/course fields directly if needed.\n */\n constructor(user, course, strategyData) {\n this.user = user;\n this.course = course;\n if (strategyData) {\n this.strategyName = strategyData.name;\n this.strategyId = strategyData._id;\n this.learnable = strategyData.learnable;\n this.staticWeight = strategyData.staticWeight;\n }\n }\n // ============================================================================\n // STRATEGY STATE HELPERS\n // ============================================================================\n //\n // These methods allow strategies to persist their own state (user preferences,\n // learned patterns, temporal tracking) in the user database.\n //\n // ============================================================================\n /**\n * Unique key identifying this strategy for state storage.\n *\n * Defaults to the constructor name (e.g., \"UserTagPreferenceFilter\").\n * Override in subclasses if multiple instances of the same strategy type\n * need separate state storage.\n */\n get strategyKey() {\n return this.constructor.name;\n }\n /**\n * Get this strategy's persisted state for the current course.\n *\n * @returns The strategy's data payload, or null if no state exists\n * @throws Error if user or course is not initialized\n */\n async getStrategyState() {\n if (!this.user || !this.course) {\n throw new Error(\n `Cannot get strategy state: navigator not properly initialized. Ensure user and course are provided to constructor.`\n );\n }\n return this.user.getStrategyState(this.course.getCourseID(), this.strategyKey);\n }\n /**\n * Persist this strategy's state for the current course.\n *\n * @param data - The strategy's data payload to store\n * @throws Error if user or course is not initialized\n */\n async putStrategyState(data) {\n if (!this.user || !this.course) {\n throw new Error(\n `Cannot put strategy state: navigator not properly initialized. Ensure user and course are provided to constructor.`\n );\n }\n return this.user.putStrategyState(this.course.getCourseID(), this.strategyKey, data);\n }\n /**\n * Factory method to create navigator instances.\n *\n * First checks the navigator registry for a pre-registered constructor.\n * If not found, falls back to dynamic import (for custom navigators).\n *\n * For reliable operation in test environments, call initializeNavigatorRegistry()\n * before using this method.\n *\n * @param user - User interface\n * @param course - Course interface\n * @param strategyData - Strategy configuration document\n * @returns the runtime object used to steer a study session.\n */\n static async create(user, course, strategyData) {\n const implementingClass = strategyData.implementingClass;\n const RegisteredImpl = getRegisteredNavigator(implementingClass);\n if (RegisteredImpl) {\n logger.debug(`[ContentNavigator.create] Using registered navigator: ${implementingClass}`);\n return new RegisteredImpl(user, course, strategyData);\n }\n logger.debug(\n `[ContentNavigator.create] Navigator not in registry, attempting dynamic import: ${implementingClass}`\n );\n let NavigatorImpl;\n const variations = [\".ts\", \".js\", \"\"];\n for (const ext of variations) {\n try {\n const module = await globImport_generators(`./generators/${implementingClass}${ext}`);\n NavigatorImpl = module.default;\n if (NavigatorImpl) break;\n } catch (e) {\n logger.debug(`Failed to load generator ${implementingClass}${ext}:`, e);\n }\n try {\n const module = await globImport_filters(`./filters/${implementingClass}${ext}`);\n NavigatorImpl = module.default;\n if (NavigatorImpl) break;\n } catch (e) {\n logger.debug(`Failed to load filter ${implementingClass}${ext}:`, e);\n }\n try {\n const module = await globImport(`./${implementingClass}${ext}`);\n NavigatorImpl = module.default;\n if (NavigatorImpl) break;\n } catch (e) {\n logger.debug(`Failed to load legacy ${implementingClass}${ext}:`, e);\n }\n if (NavigatorImpl) break;\n }\n if (!NavigatorImpl) {\n throw new Error(`Could not load navigator implementation for: ${implementingClass}`);\n }\n return new NavigatorImpl(user, course, strategyData);\n }\n /**\n * Get cards with suitability scores and provenance trails.\n *\n * **This is the PRIMARY API for navigation strategies.**\n *\n * Returns cards ranked by suitability score (0-1). Higher scores indicate\n * better candidates for presentation. Each card includes a provenance trail\n * documenting how strategies contributed to the final score.\n *\n * ## Implementation Required\n * All navigation strategies MUST override this method. The base class does\n * not provide a default implementation.\n *\n * ## For Generators\n * Override this method to generate candidates and compute scores based on\n * your strategy's logic (e.g., ELO proximity, review urgency). Create the\n * initial provenance entry with action='generated'.\n *\n * ## For Filters\n * Filters should implement the CardFilter interface instead and be composed\n * via Pipeline. Filters do not directly implement getWeightedCards().\n *\n * @param limit - Maximum cards to return\n * @returns Cards sorted by score descending, with provenance trails\n */\n async getWeightedCards(_limit) {\n throw new Error(`${this.constructor.name} must implement getWeightedCards(). `);\n }\n /**\n * Set ephemeral hints for the next pipeline run.\n * No-op for non-Pipeline navigators. Pipeline overrides this.\n */\n setEphemeralHints(_hints) {\n }\n };\n }\n});\n\n// src/impl/couch/courseDB.ts\nimport {\n EloToNumber,\n Status,\n blankCourseElo as blankCourseElo2,\n toCourseElo as toCourseElo6\n} from \"@vue-skuilder/common\";\nfunction randIntWeightedTowardZero(n) {\n return Math.floor(Math.random() * Math.random() * Math.random() * n);\n}\nasync function getCourseTagStubs(courseID) {\n logger.debug(`Getting tag stubs for course: ${courseID}`);\n const stubs = await filterAllDocsByPrefix2(\n getCourseDB2(courseID),\n \"TAG\" /* TAG */.valueOf() + \"-\"\n );\n stubs.rows.forEach((row) => {\n logger.debug(`\tTag stub for doc: ${row.id}`);\n });\n return stubs;\n}\nasync function createTag(courseID, tagName, author) {\n logger.debug(`Creating tag: ${tagName}...`);\n const tagID = getTagID(tagName);\n const courseDB = getCourseDB2(courseID);\n const resp = await courseDB.put({\n course: courseID,\n docType: \"TAG\" /* TAG */,\n name: tagName,\n snippet: \"\",\n taggedCards: [],\n wiki: \"\",\n author,\n _id: tagID\n });\n return resp;\n}\nasync function updateTag(tag) {\n const prior = await getTag(tag.course, tag.name);\n return await getCourseDB2(tag.course).put({\n ...tag,\n _rev: prior._rev\n });\n}\nasync function getTag(courseID, tagName) {\n const tagID = getTagID(tagName);\n const courseDB = getCourseDB2(courseID);\n return courseDB.get(tagID);\n}\nasync function removeTagFromCard(courseID, cardID, tagID) {\n tagID = getTagID(tagID);\n const courseDB = getCourseDB2(courseID);\n const tag = await courseDB.get(tagID);\n tag.taggedCards = tag.taggedCards.filter((taggedID) => {\n return cardID !== taggedID;\n });\n return courseDB.put(tag);\n}\nasync function getAppliedTags(id_course, id_card) {\n const db = getCourseDB2(id_course);\n const result = await db.query(\"getTags\", {\n startkey: id_card,\n endkey: id_card\n // include_docs: true\n });\n return result;\n}\nasync function updateCredentialledCourseConfig(courseID, config) {\n logger.debug(`Updating course config:\n\n${JSON.stringify(config)}\n`);\n const db = getCourseDB2(courseID);\n const old = await getCredentialledCourseConfig(courseID);\n return await db.put({\n ...config,\n _rev: old._rev\n });\n}\nfunction isSuccessRow(row) {\n return \"doc\" in row && row.doc !== null && row.doc !== void 0;\n}\nvar CoursesDB, CourseDB;\nvar init_courseDB = __esm({\n \"src/impl/couch/courseDB.ts\"() {\n \"use strict\";\n init_couch();\n init_updateQueue();\n init_types_legacy();\n init_logger();\n init_clientCache();\n init_courseAPI();\n init_courseLookupDB();\n init_navigators();\n init_PipelineAssembler();\n init_defaults();\n CoursesDB = class {\n _courseIDs;\n constructor(courseIDs) {\n if (courseIDs && courseIDs.length > 0) {\n this._courseIDs = courseIDs;\n } else {\n this._courseIDs = void 0;\n }\n }\n async getCourseList() {\n let crsList = await CourseLookup.allCourseWare();\n logger.debug(`AllCourses: ${crsList.map((c) => c.name + \", \" + c._id + \"\\n\t\")}`);\n if (this._courseIDs) {\n crsList = crsList.filter((c) => this._courseIDs.includes(c._id));\n }\n logger.debug(`AllCourses.filtered: ${crsList.map((c) => c.name + \", \" + c._id + \"\\n\t\")}`);\n const cfgs = await Promise.all(\n crsList.map(async (c) => {\n try {\n const cfg = await getCredentialledCourseConfig(c._id);\n logger.debug(`Found cfg: ${JSON.stringify(cfg)}`);\n return cfg;\n } catch (e) {\n logger.warn(`Error fetching cfg for course ${c.name}, ${c._id}: ${e}`);\n return void 0;\n }\n })\n );\n return cfgs.filter((c) => !!c);\n }\n async getCourseConfig(courseId) {\n if (this._courseIDs && this._courseIDs.length && !this._courseIDs.includes(courseId)) {\n throw new Error(`Course ${courseId} not in course list`);\n }\n const cfg = await getCredentialledCourseConfig(courseId);\n if (cfg === void 0) {\n throw new Error(`Error fetching cfg for course ${courseId}`);\n } else {\n return cfg;\n }\n }\n async disambiguateCourse(courseId, disambiguator) {\n await CourseLookup.updateDisambiguator(courseId, disambiguator);\n }\n };\n CourseDB = class {\n // private log(msg: string): void {\n // log(`CourseLog: ${this.id}\\n ${msg}`);\n // }\n /**\n * Primary database handle used for all **read** operations (queries, gets).\n *\n * When local sync is active, this points to the local PouchDB replica for\n * fast, network-free reads. Otherwise it points to the remote CouchDB.\n */\n db;\n /**\n * Remote database handle used for all **write** operations.\n *\n * Always points to the remote CouchDB so that writes (ELO updates, tag\n * mutations, admin operations) aggregate on the server. The local replica\n * is a read-only snapshot that refreshes on the next page load.\n *\n * When local sync is NOT active, this is the same instance as `this.db`.\n */\n remoteDB;\n id;\n _getCurrentUser;\n updateQueue;\n /**\n * @param id - Course ID\n * @param userLookup - Async function returning the current user DB\n * @param localDB - Optional local PouchDB replica for reads. When provided,\n * `this.db` uses the local replica and `this.remoteDB` stays remote.\n * The UpdateQueue reads from remote and writes to remote (local `_rev`\n * values may be stale, so read-modify-write cycles must go through\n * the remote DB to avoid conflicts).\n */\n constructor(id, userLookup, localDB) {\n this.id = id;\n const remote = getCourseDB2(this.id);\n this.remoteDB = remote;\n this.db = localDB ?? remote;\n this._getCurrentUser = userLookup;\n this.updateQueue = new UpdateQueue(this.remoteDB, this.remoteDB);\n }\n getCourseID() {\n return this.id;\n }\n async getCourseInfo() {\n const cardCount = (await this.db.find({\n selector: {\n docType: \"CARD\" /* CARD */\n },\n limit: 1e3\n })).docs.length;\n return {\n cardCount,\n registeredUsers: 0\n };\n }\n async getInexperiencedCards(limit = 2) {\n return (await this.db.query(\"cardsByInexperience\", {\n limit\n })).rows.map((r) => {\n const ret = {\n courseId: this.id,\n cardId: r.id,\n count: r.key,\n elo: r.value\n };\n return ret;\n });\n }\n async getCardsByEloLimits(options = {\n low: 0,\n high: Number.MIN_SAFE_INTEGER,\n limit: 25,\n page: 0\n }) {\n return (await this.db.query(\"elo\", {\n startkey: options.low,\n endkey: options.high,\n limit: options.limit,\n skip: options.limit * options.page\n })).rows.map((r) => {\n return `${this.id}-${r.id}-${r.key}`;\n });\n }\n async getCardEloData(id) {\n const docs = await this.db.allDocs({\n keys: id,\n include_docs: true\n });\n const ret = [];\n docs.rows.forEach((r) => {\n if (isSuccessRow(r)) {\n if (r.doc && r.doc.elo) {\n ret.push(toCourseElo6(r.doc.elo));\n } else {\n logger.warn(\"no elo data for card: \" + r.id);\n ret.push(blankCourseElo2());\n }\n } else {\n logger.warn(\"no elo data for card: \" + JSON.stringify(r));\n ret.push(blankCourseElo2());\n }\n });\n return ret;\n }\n /**\n * Returns the lowest and highest `global` ELO ratings in the course\n */\n async getELOBounds() {\n const [low, high] = await Promise.all([\n (await this.db.query(\"elo\", {\n startkey: 0,\n limit: 1,\n include_docs: false\n })).rows[0].key,\n (await this.db.query(\"elo\", {\n limit: 1,\n descending: true,\n startkey: 1e5\n })).rows[0].key\n ]);\n return {\n low,\n high\n };\n }\n async removeCard(id) {\n const doc = await this.remoteDB.get(id);\n if (!doc.docType || !(doc.docType === \"CARD\" /* CARD */)) {\n throw new Error(`failed to remove ${id} from course ${this.id}. id does not point to a card`);\n }\n try {\n const appliedTags = await this.getAppliedTags(id);\n const results = await Promise.allSettled(\n appliedTags.rows.map(async (tagRow) => {\n const tagId = tagRow.id;\n await this.removeTagFromCard(id, tagId);\n })\n );\n results.forEach((result, index) => {\n if (result.status === \"rejected\") {\n const tagId = appliedTags.rows[index].id;\n logger.error(`Failed to remove card ${id} from tag ${tagId}: ${result.reason}`);\n }\n });\n } catch (error) {\n logger.error(`Error removing card ${id} from tags: ${error}`);\n }\n return this.remoteDB.remove(doc);\n }\n async getCardDisplayableDataIDs(id) {\n logger.debug(id.join(\", \"));\n const cards = await this.db.allDocs({\n keys: id,\n include_docs: true\n });\n const ret = {};\n cards.rows.forEach((r) => {\n if (isSuccessRow(r)) {\n ret[r.id] = r.doc.id_displayable_data;\n }\n });\n return ret;\n }\n async getCardsByELO(elo, cardLimit) {\n elo = parseInt(elo);\n const limit = cardLimit ? cardLimit : 25;\n const below = await this.db.query(\"elo\", {\n limit: Math.ceil(limit / 2),\n startkey: elo,\n descending: true\n });\n const aboveLimit = limit - below.rows.length;\n const above = await this.db.query(\"elo\", {\n limit: aboveLimit,\n startkey: elo + 1\n });\n let cards = below.rows;\n cards = cards.concat(above.rows);\n const ret = cards.sort((a, b) => {\n const s = Math.abs(a.key - elo) - Math.abs(b.key - elo);\n if (s === 0) {\n return Math.random() - 0.5;\n } else {\n return s;\n }\n }).map((c) => {\n return {\n courseID: this.id,\n cardID: c.id,\n elo: c.key\n };\n });\n const str = `below:\n${below.rows.map((r) => `\t${r.id}-${r.key}\n`)}\n\nabove:\n${above.rows.map((r) => `\t${r.id}-${r.key}\n`)}`;\n logger.debug(`Getting ${limit} cards centered around elo: ${elo}:\n\n` + str);\n return ret;\n }\n async getCourseConfig() {\n const ret = await getCredentialledCourseConfig(this.id);\n if (ret) {\n return ret;\n } else {\n throw new Error(`Course config not found for course ID: ${this.id}`);\n }\n }\n async updateCourseConfig(cfg) {\n logger.debug(`Updating: ${JSON.stringify(cfg)}`);\n try {\n return await updateCredentialledCourseConfig(this.id, cfg);\n } catch (error) {\n logger.error(`Error updating course config in course DB: ${error}`);\n throw error;\n }\n }\n async updateCardElo(cardId, elo) {\n if (!elo) {\n throw new Error(`Cannot update card elo with null or undefined value for card ID: ${cardId}`);\n }\n try {\n const result = await this.updateQueue.update(cardId, (card) => {\n logger.debug(`Replacing ${JSON.stringify(card.elo)} with ${JSON.stringify(elo)}`);\n card.elo = elo;\n return card;\n });\n return { ok: true, id: cardId, rev: result._rev };\n } catch (error) {\n logger.error(`Failed to update card elo for card ID: ${cardId}`, error);\n throw new Error(`Failed to update card elo for card ID: ${cardId}`);\n }\n }\n async getAppliedTags(cardId) {\n const ret = await getAppliedTags(this.id, cardId);\n if (ret) {\n return ret;\n } else {\n throw new Error(`Failed to find tags for card ${this.id}-${cardId}`);\n }\n }\n async getAppliedTagsBatch(cardIds) {\n if (cardIds.length === 0) {\n return /* @__PURE__ */ new Map();\n }\n const result = await this.db.query(\"getTags\", {\n keys: cardIds,\n include_docs: false\n });\n const tagsByCard = /* @__PURE__ */ new Map();\n for (const cardId of cardIds) {\n tagsByCard.set(cardId, []);\n }\n for (const row of result.rows) {\n const cardId = row.key;\n const tagName = row.value?.name;\n if (tagName && tagsByCard.has(cardId)) {\n tagsByCard.get(cardId).push(tagName);\n }\n }\n return tagsByCard;\n }\n async getAllCardIds() {\n const result = await this.db.allDocs({\n startkey: \"CARD-\",\n endkey: \"CARD-\\uFFF0\",\n include_docs: false\n });\n return result.rows.map((row) => row.id);\n }\n async addTagToCard(cardId, tagId, updateELO) {\n return await addTagToCard(\n this.id,\n cardId,\n tagId,\n (await this._getCurrentUser()).getUsername(),\n updateELO\n );\n }\n async removeTagFromCard(cardId, tagId) {\n return await removeTagFromCard(this.id, cardId, tagId);\n }\n async createTag(name, author) {\n return await createTag(this.id, name, author);\n }\n async getTag(tagId) {\n return await getTag(this.id, tagId);\n }\n async updateTag(tag) {\n if (tag.course !== this.id) {\n throw new Error(`Tag ${JSON.stringify(tag)} does not belong to course ${this.id}`);\n }\n return await updateTag(tag);\n }\n async getCourseTagStubs() {\n return getCourseTagStubs(this.id);\n }\n async addNote(codeCourse, shape, data, author, tags, uploads, elo = blankCourseElo2()) {\n try {\n const resp = await addNote55(this.id, codeCourse, shape, data, author, tags, uploads, elo);\n if (resp.ok) {\n if (resp.cardCreationFailed) {\n logger.warn(\n `[courseDB.addNote] Note added but card creation failed: ${resp.cardCreationError}`\n );\n return {\n status: Status.error,\n message: `Note was added but no cards were created: ${resp.cardCreationError}`,\n id: resp.id\n };\n }\n return {\n status: Status.ok,\n message: \"\",\n id: resp.id\n };\n } else {\n return {\n status: Status.error,\n message: \"Unexpected error adding note\"\n };\n }\n } catch (e) {\n const err = e;\n logger.error(\n `[addNote] error ${err.name}\n\treason: ${err.reason}\n\tmessage: ${err.message}`\n );\n return {\n status: Status.error,\n message: `Error adding note to course. ${e.reason || err.message}`\n };\n }\n }\n async getCourseDoc(id, options) {\n return await this.db.get(id, options ?? {});\n }\n async getCourseDocs(ids, options = {}) {\n return await this.db.allDocs({\n ...options,\n keys: ids\n });\n }\n ////////////////////////////////////\n // NavigationStrategyManager implementation\n ////////////////////////////////////\n getNavigationStrategy(id) {\n logger.debug(`[courseDB] Getting navigation strategy: ${id}`);\n if (id == \"\") {\n const strategy = {\n _id: \"NAVIGATION_STRATEGY-ELO\",\n docType: \"NAVIGATION_STRATEGY\" /* NAVIGATION_STRATEGY */,\n name: \"ELO\",\n description: \"ELO-based navigation strategy for ordering content by difficulty\",\n implementingClass: \"elo\" /* ELO */,\n course: this.id,\n serializedData: \"\"\n // serde is a noop for ELO navigator.\n };\n return Promise.resolve(strategy);\n } else {\n return this.db.get(id);\n }\n }\n async getAllNavigationStrategies() {\n const prefix = DocTypePrefixes[\"NAVIGATION_STRATEGY\" /* NAVIGATION_STRATEGY */];\n const result = await this.db.allDocs({\n startkey: prefix,\n endkey: `${prefix}\\uFFF0`,\n include_docs: true\n });\n return result.rows.map((row) => row.doc);\n }\n async addNavigationStrategy(data) {\n logger.debug(`[courseDB] Adding navigation strategy: ${data._id}`);\n return this.remoteDB.put(data).then(() => {\n });\n }\n updateNavigationStrategy(id, data) {\n logger.debug(`[courseDB] Updating navigation strategy: ${id}`);\n logger.debug(JSON.stringify(data));\n return Promise.resolve();\n }\n /**\n * Creates an instantiated navigator for this course.\n *\n * Handles multiple generators by wrapping them in CompositeGenerator.\n * This is the preferred method for getting a ready-to-use navigator.\n *\n * @param user - User database interface\n * @returns Instantiated ContentNavigator ready for use\n */\n async createNavigator(user) {\n try {\n const allStrategies = await this.getAllNavigationStrategies();\n if (allStrategies.length === 0) {\n logger.debug(\n \"[courseDB] No strategy documents found, using default Pipeline(Composite(ELO, SRS), [eloDistanceFilter])\"\n );\n return createDefaultPipeline(user, this);\n }\n const assembler = new PipelineAssembler();\n const { pipeline, generatorStrategies, filterStrategies, warnings } = await assembler.assemble({\n strategies: allStrategies,\n user,\n course: this\n });\n for (const warning of warnings) {\n logger.warn(`[PipelineAssembler] ${warning}`);\n }\n if (!pipeline) {\n logger.debug(\"[courseDB] Pipeline assembly failed, using default pipeline\");\n return createDefaultPipeline(user, this);\n }\n logger.debug(\n `[courseDB] Using assembled pipeline with ${generatorStrategies.length} generator(s) and ${filterStrategies.length} filter(s)`\n );\n return pipeline;\n } catch (e) {\n const msg = e instanceof Error ? `${e.message}\n${e.stack}` : JSON.stringify(e);\n logger.error(`[courseDB] Error creating navigator: ${msg}`);\n throw e;\n }\n }\n ////////////////////////////////////\n // END NavigationStrategyManager implementation\n ////////////////////////////////////\n ////////////////////////////////////\n // StudyContentSource implementation\n ////////////////////////////////////\n /**\n * Get cards with suitability scores for presentation.\n *\n * This is the PRIMARY API for content sources going forward. Delegates to the\n * course's configured NavigationStrategy to get scored candidates.\n *\n * @param limit - Maximum number of cards to return\n * @returns Cards sorted by score descending\n */\n _pendingHints = null;\n setEphemeralHints(hints) {\n this._pendingHints = hints;\n }\n async getWeightedCards(limit) {\n const u = await this._getCurrentUser();\n try {\n const navigator = await this.createNavigator(u);\n if (this._pendingHints) {\n navigator.setEphemeralHints(this._pendingHints);\n this._pendingHints = null;\n }\n return navigator.getWeightedCards(limit);\n } catch (e) {\n logger.error(`[courseDB] Error getting weighted cards: ${e}`);\n throw e;\n }\n }\n async getCardsCenteredAtELO(options = {\n limit: 99,\n elo: \"user\"\n }, filter) {\n let targetElo;\n if (options.elo === \"user\") {\n const u = await this._getCurrentUser();\n targetElo = -1;\n try {\n const courseDoc = (await u.getCourseRegistrationsDoc()).courses.find((c) => {\n return c.courseID === this.id;\n });\n targetElo = EloToNumber(courseDoc.elo);\n } catch {\n targetElo = 1e3;\n }\n } else if (options.elo === \"random\") {\n const bounds = await GET_CACHED(`elo-bounds-${this.id}`, () => this.getELOBounds());\n targetElo = Math.round(bounds.low + Math.random() * (bounds.high - bounds.low));\n } else {\n targetElo = options.elo;\n }\n let cards = [];\n let mult = 4;\n let previousCount = -1;\n let newCount = 0;\n while (cards.length < options.limit && newCount !== previousCount) {\n cards = await this.getCardsByELO(targetElo, mult * options.limit);\n previousCount = newCount;\n newCount = cards.length;\n logger.debug(`Found ${cards.length} elo neighbor cards...`);\n if (filter) {\n cards = cards.filter(filter);\n logger.debug(`Filtered to ${cards.length} cards...`);\n }\n mult *= 2;\n }\n const selectedCards = [];\n while (selectedCards.length < options.limit && cards.length > 0) {\n const index = randIntWeightedTowardZero(cards.length);\n const card = cards.splice(index, 1)[0];\n selectedCards.push(card);\n }\n return selectedCards.map((c) => {\n return {\n courseID: this.id,\n cardID: c.cardID,\n contentSourceType: \"course\",\n contentSourceID: this.id,\n elo: c.elo,\n status: \"new\"\n };\n });\n }\n // Admin search methods\n async searchCards(query) {\n logger.log(`[CourseDB ${this.id}] Searching for: \"${query}\"`);\n let displayableData;\n try {\n displayableData = await this.db.find({\n selector: {\n docType: \"DISPLAYABLE_DATA\",\n \"data.0.data\": { $regex: `.*${query}.*` }\n }\n });\n logger.log(`[CourseDB ${this.id}] Regex search on data[0].data successful`);\n } catch (regexError) {\n logger.log(\n `[CourseDB ${this.id}] Regex search failed, falling back to manual search:`,\n regexError\n );\n const allDisplayable = await this.db.find({\n selector: {\n docType: \"DISPLAYABLE_DATA\"\n }\n });\n logger.log(\n `[CourseDB ${this.id}] Retrieved ${allDisplayable.docs.length} documents for manual filtering`\n );\n displayableData = {\n docs: allDisplayable.docs.filter((doc) => {\n const docString = JSON.stringify(doc).toLowerCase();\n const match = docString.includes(query.toLowerCase());\n if (match) {\n logger.log(`[CourseDB ${this.id}] Manual match found in document: ${doc._id}`);\n }\n return match;\n })\n };\n }\n logger.log(\n `[CourseDB ${this.id}] Found ${displayableData.docs.length} displayable data documents`\n );\n if (displayableData.docs.length === 0) {\n const allDisplayableData = await this.db.find({\n selector: {\n docType: \"DISPLAYABLE_DATA\"\n },\n limit: 5\n // Just sample a few\n });\n logger.log(\n `[CourseDB ${this.id}] Sample displayable data:`,\n allDisplayableData.docs.map((d) => ({\n id: d._id,\n docType: d.docType,\n dataStructure: d.data ? Object.keys(d.data) : \"no data field\",\n dataContent: d.data,\n fullDoc: d\n }))\n );\n }\n const allResults = [];\n for (const dd of displayableData.docs) {\n const cards = await this.db.find({\n selector: {\n docType: \"CARD\",\n id_displayable_data: { $in: [dd._id] }\n }\n });\n logger.log(\n `[CourseDB ${this.id}] Displayable data ${dd._id} linked to ${cards.docs.length} cards`\n );\n allResults.push(...cards.docs);\n }\n logger.log(`[CourseDB ${this.id}] Total cards found: ${allResults.length}`);\n return allResults;\n }\n async find(request) {\n return this.db.find(request);\n }\n };\n }\n});\n\n// src/impl/couch/classroomDB.ts\nimport moment4 from \"moment\";\nvar classroomLookupDBTitle, CLASSROOM_CONFIG, ClassroomDBBase, StudentClassroomDB, TeacherClassroomDB, ClassroomLookupDB;\nvar init_classroomDB2 = __esm({\n \"src/impl/couch/classroomDB.ts\"() {\n \"use strict\";\n init_factory();\n init_logger();\n init_pouchdb_setup();\n init_couch();\n init_courseDB();\n classroomLookupDBTitle = \"classdb-lookup\";\n CLASSROOM_CONFIG = \"ClassroomConfig\";\n ClassroomDBBase = class {\n _id;\n _db;\n _cfg;\n _initComplete = false;\n _content_prefix = \"content\";\n get _content_searchkeys() {\n return getStartAndEndKeys2(this._content_prefix);\n }\n async getAssignedContent() {\n logger.info(`Getting assigned content...`);\n const docRows = await this._db.allDocs({\n startkey: this._content_prefix,\n endkey: this._content_prefix + `\\uFFF0`,\n include_docs: true\n });\n const ret = docRows.rows.map((row) => {\n return row.doc;\n });\n return ret;\n }\n getContentId(content) {\n if (content.type === \"tag\") {\n return `${this._content_prefix}-${content.courseID}-${content.tagID}`;\n } else {\n return `${this._content_prefix}-${content.courseID}`;\n }\n }\n get ready() {\n return this._initComplete;\n }\n getConfig() {\n return this._cfg;\n }\n };\n StudentClassroomDB = class _StudentClassroomDB extends ClassroomDBBase {\n // private readonly _prefix: string = 'content';\n userMessages;\n _user;\n constructor(classID, user) {\n super();\n this._id = classID;\n this._user = user;\n }\n async init() {\n const dbName = `classdb-student-${this._id}`;\n this._db = new pouchdb_setup_default(\n ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + dbName,\n createPouchDBConfig()\n );\n try {\n const cfg = await this._db.get(CLASSROOM_CONFIG);\n this._cfg = cfg;\n this.userMessages = this._db.changes({\n since: \"now\",\n live: true,\n include_docs: true\n });\n this._initComplete = true;\n return;\n } catch (e) {\n throw new Error(`Error in StudentClassroomDB constructor: ${JSON.stringify(e)}`);\n }\n }\n static async factory(classID, user) {\n const ret = new _StudentClassroomDB(classID, user);\n await ret.init();\n return ret;\n }\n setChangeFcn(f) {\n void this.userMessages.on(\"change\", f);\n }\n /**\n * Get cards with suitability scores for presentation.\n *\n * Gathers new cards from assigned content (courses, tags, cards) and\n * pending reviews scheduled for this classroom. Assigns score=1.0 to all.\n *\n * @param limit - Maximum number of cards to return\n * @returns Cards sorted by score descending (all scores = 1.0)\n */\n async getWeightedCards(limit) {\n const weighted = [];\n const allUserReviews = await this._user.getPendingReviews();\n const classroomReviews = allUserReviews.filter(\n (r) => r.scheduledFor === \"classroom\" && r.schedulingAgentId === this._id\n );\n for (const r of classroomReviews) {\n weighted.push({\n cardId: r.cardId,\n courseId: r.courseId,\n score: 1,\n reviewID: r._id,\n provenance: [\n {\n strategy: \"classroom\",\n strategyName: \"Classroom\",\n strategyId: \"CLASSROOM\",\n action: \"generated\",\n score: 1,\n reason: \"Classroom scheduled review\"\n }\n ]\n });\n }\n const activeCards = await this._user.getActiveCards();\n const activeCardIds = new Set(activeCards.map((ac) => ac.cardID));\n const now = moment4.utc();\n const assigned = await this.getAssignedContent();\n const due = assigned.filter((c) => now.isAfter(moment4.utc(c.activeOn, REVIEW_TIME_FORMAT2)));\n logger.info(`[StudentClassroomDB] Due content: ${JSON.stringify(due)}`);\n for (const content of due) {\n if (content.type === \"course\") {\n const db = new CourseDB(content.courseID, async () => this._user);\n const { cards: courseCards } = await db.getWeightedCards(limit);\n for (const card of courseCards) {\n if (!activeCardIds.has(card.cardId)) {\n weighted.push({\n ...card,\n provenance: [\n ...card.provenance,\n {\n strategy: \"classroom\",\n strategyName: \"Classroom\",\n strategyId: \"CLASSROOM\",\n action: \"passed\",\n score: card.score,\n reason: `Assigned via classroom from course ${content.courseID}`\n }\n ]\n });\n }\n }\n } else if (content.type === \"tag\") {\n const tagDoc = await getTag(content.courseID, content.tagID);\n for (const cardId of tagDoc.taggedCards) {\n if (!activeCardIds.has(cardId)) {\n weighted.push({\n cardId,\n courseId: content.courseID,\n score: 1,\n provenance: [\n {\n strategy: \"classroom\",\n strategyName: \"Classroom\",\n strategyId: \"CLASSROOM\",\n action: \"generated\",\n score: 1,\n reason: `Classroom assigned tag: ${content.tagID}, new card`\n }\n ]\n });\n }\n }\n } else if (content.type === \"card\") {\n if (!activeCardIds.has(content.cardID)) {\n weighted.push({\n cardId: content.cardID,\n courseId: content.courseID,\n score: 1,\n provenance: [\n {\n strategy: \"classroom\",\n strategyName: \"Classroom\",\n strategyId: \"CLASSROOM\",\n action: \"generated\",\n score: 1,\n reason: \"Classroom assigned card, new card\"\n }\n ]\n });\n }\n }\n }\n logger.info(\n `[StudentClassroomDB] New cards from classroom ${this._cfg.name}: ${weighted.length} total (reviews + new)`\n );\n return { cards: weighted.sort((a, b) => b.score - a.score).slice(0, limit) };\n }\n };\n TeacherClassroomDB = class _TeacherClassroomDB extends ClassroomDBBase {\n _stuDb;\n constructor(classID) {\n super();\n this._id = classID;\n }\n async init() {\n const dbName = `classdb-teacher-${this._id}`;\n const stuDbName = `classdb-student-${this._id}`;\n this._db = new pouchdb_setup_default(\n ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + dbName,\n createPouchDBConfig()\n );\n this._stuDb = new pouchdb_setup_default(\n ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + stuDbName,\n createPouchDBConfig()\n );\n try {\n return this._db.get(CLASSROOM_CONFIG).then((cfg) => {\n this._cfg = cfg;\n this._initComplete = true;\n }).then(() => {\n return;\n });\n } catch (e) {\n throw new Error(`Error in TeacherClassroomDB constructor: ${JSON.stringify(e)}`);\n }\n }\n static async factory(classID) {\n const ret = new _TeacherClassroomDB(classID);\n await ret.init();\n return ret;\n }\n async removeContent(content) {\n const contentID = this.getContentId(content);\n try {\n const doc = await this._db.get(contentID);\n await this._db.remove(doc);\n void this._db.replicate.to(this._stuDb, {\n doc_ids: [contentID]\n });\n } catch (error) {\n logger.error(\"Failed to remove content:\", contentID, error);\n }\n }\n async assignContent(content) {\n let put;\n const id = this.getContentId(content);\n if (content.type === \"tag\") {\n put = await this._db.put({\n courseID: content.courseID,\n tagID: content.tagID,\n type: \"tag\",\n _id: id,\n assignedBy: content.assignedBy,\n assignedOn: moment4.utc(),\n activeOn: content.activeOn || moment4.utc()\n });\n } else {\n put = await this._db.put({\n courseID: content.courseID,\n type: \"course\",\n _id: id,\n assignedBy: content.assignedBy,\n assignedOn: moment4.utc(),\n activeOn: content.activeOn || moment4.utc()\n });\n }\n if (put.ok) {\n void this._db.replicate.to(this._stuDb, {\n doc_ids: [id]\n });\n return true;\n } else {\n return false;\n }\n }\n };\n ClassroomLookupDB = () => new pouchdb_setup_default(ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + classroomLookupDBTitle, {\n skip_setup: true\n });\n }\n});\n\n// src/impl/couch/adminDB.ts\nvar AdminDB;\nvar init_adminDB2 = __esm({\n \"src/impl/couch/adminDB.ts\"() {\n \"use strict\";\n init_pouchdb_setup();\n init_factory();\n init_couch();\n init_classroomDB2();\n init_courseLookupDB();\n init_logger();\n AdminDB = class {\n usersDB;\n constructor() {\n this.usersDB = new pouchdb_setup_default(\n ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + \"_users\",\n createPouchDBConfig()\n );\n }\n async getUsers() {\n return (await this.usersDB.allDocs({\n include_docs: true,\n ...getStartAndEndKeys2(\"org.couchdb.user:\")\n })).rows.map((r) => r.doc);\n }\n async getCourses() {\n const list = await CourseLookup.allCourseWare();\n return await Promise.all(\n list.map((c) => {\n return getCredentialledCourseConfig(c._id);\n })\n );\n }\n async removeCourse(id) {\n const delResp = await CourseLookup.delete(id);\n const cfg = await getCredentialledCourseConfig(id);\n cfg.deleted = true;\n const isDeletedResp = await updateCredentialledCourseConfig(id, cfg);\n return {\n ok: delResp.ok && isDeletedResp.ok,\n id: delResp.id,\n rev: delResp.rev\n };\n }\n async getClassrooms() {\n const uuids = (await ClassroomLookupDB().allDocs({\n include_docs: true\n })).rows.map((r) => r.doc.uuid);\n logger.debug(uuids.join(\", \"));\n const promisedCRDbs = [];\n for (let i = 0; i < uuids.length; i++) {\n try {\n const db = await TeacherClassroomDB.factory(uuids[i]);\n promisedCRDbs.push(db);\n } catch (e) {\n const err = e;\n if (err.error && err.error === \"not_found\") {\n logger.warn(`db ${uuids[i]} not found`);\n }\n }\n }\n return promisedCRDbs.map((db) => {\n return {\n ...db.getConfig(),\n _id: db._id\n };\n });\n }\n };\n }\n});\n\n// src/impl/couch/CourseSyncService.ts\nvar CourseSyncService;\nvar init_CourseSyncService = __esm({\n \"src/impl/couch/CourseSyncService.ts\"() {\n \"use strict\";\n init_pouchdb_setup();\n init_couch();\n init_logger();\n CourseSyncService = class _CourseSyncService {\n static instance = null;\n entries = /* @__PURE__ */ new Map();\n constructor() {\n }\n static getInstance() {\n if (!_CourseSyncService.instance) {\n _CourseSyncService.instance = new _CourseSyncService();\n }\n return _CourseSyncService.instance;\n }\n /**\n * Reset the singleton (for testing).\n */\n static resetInstance() {\n if (_CourseSyncService.instance) {\n for (const [, entry] of _CourseSyncService.instance.entries) {\n if (entry.localDB) {\n entry.localDB.close().catch(() => {\n });\n }\n }\n _CourseSyncService.instance.entries.clear();\n }\n _CourseSyncService.instance = null;\n }\n // --------------------------------------------------------------------------\n // Public API\n // --------------------------------------------------------------------------\n /**\n * Ensure a course's local replica is synced.\n *\n * On first call for a course:\n * 1. Fetches CourseConfig from remote to check localSync.enabled\n * 2. If enabled, performs one-shot replication remote → local\n * 3. Pre-warms PouchDB view indices (elo, getTags)\n *\n * On subsequent calls: returns immediately if already synced, or awaits\n * the in-flight sync if one is in progress.\n *\n * Safe to call multiple times — concurrent calls coalesce to one sync.\n *\n * @param courseId - The course to sync\n * @param forceEnabled - Skip the CourseConfig check and sync regardless.\n * Useful when the caller already knows local sync is desired (e.g.,\n * LettersPractice hardcodes this).\n */\n async ensureSynced(courseId, forceEnabled) {\n const existing = this.entries.get(courseId);\n if (existing?.status.state === \"ready\" && existing.localDB) {\n const stale = await this.isLocalEpochStale(courseId, existing.localDB);\n if (!stale) {\n return;\n }\n logger.info(\n `[CourseSyncService] Remote DB epoch changed for course ${courseId} \\u2014 destroying stale local replica`\n );\n try {\n await existing.localDB.destroy();\n } catch {\n }\n existing.localDB = null;\n existing.readyPromise = null;\n }\n if (existing?.status.state === \"disabled\") {\n return;\n }\n if (existing?.readyPromise) {\n return existing.readyPromise;\n }\n const entry = {\n localDB: null,\n status: { state: \"not-started\" },\n readyPromise: null\n };\n this.entries.set(courseId, entry);\n entry.readyPromise = this.performSync(courseId, entry, forceEnabled);\n return entry.readyPromise;\n }\n /**\n * Get the local PouchDB for a course, or null if not available.\n *\n * Returns null when:\n * - Local sync is not enabled for this course\n * - Sync has not been triggered yet\n * - Sync is still in progress\n * - Sync failed\n */\n getLocalDB(courseId) {\n const entry = this.entries.get(courseId);\n if (entry?.status.state === \"ready\" && entry.localDB) {\n return entry.localDB;\n }\n return null;\n }\n /**\n * Check whether a course has a ready local replica.\n */\n isReady(courseId) {\n return this.entries.get(courseId)?.status.state === \"ready\";\n }\n /**\n * Get detailed sync status for a course.\n */\n getStatus(courseId) {\n return this.entries.get(courseId)?.status ?? { state: \"not-started\" };\n }\n // --------------------------------------------------------------------------\n // Internal\n // --------------------------------------------------------------------------\n async performSync(courseId, entry, forceEnabled) {\n try {\n if (!forceEnabled) {\n entry.status = { state: \"checking-config\" };\n const enabled = await this.checkLocalSyncEnabled(courseId);\n if (!enabled) {\n entry.status = { state: \"disabled\" };\n entry.readyPromise = null;\n logger.debug(\n `[CourseSyncService] Local sync disabled for course ${courseId}`\n );\n return;\n }\n }\n entry.status = { state: \"syncing\" };\n const localDBName = this.localDBName(courseId);\n let localDB = new pouchdb_setup_default(localDBName);\n const stale = await this.isLocalEpochStale(courseId, localDB);\n if (stale) {\n logger.info(\n `[CourseSyncService] Stale local DB detected for course ${courseId} \\u2014 destroying before sync`\n );\n await localDB.destroy();\n localDB = new pouchdb_setup_default(localDBName);\n }\n entry.localDB = localDB;\n const remoteDB = this.getRemoteDB(courseId);\n const syncStart = Date.now();\n logger.info(\n `[CourseSyncService] Starting one-shot replication for course ${courseId}`\n );\n const result = await this.replicate(remoteDB, localDB);\n const syncTimeMs = Date.now() - syncStart;\n logger.info(\n `[CourseSyncService] Replication complete for course ${courseId}: ${result.docs_written} docs in ${syncTimeMs}ms`\n );\n entry.status = { state: \"warming-views\" };\n const warmStart = Date.now();\n await this.warmViewIndices(localDB);\n const viewWarmTimeMs = Date.now() - warmStart;\n logger.info(\n `[CourseSyncService] View indices warmed for course ${courseId} in ${viewWarmTimeMs}ms`\n );\n entry.status = {\n state: \"ready\",\n docsReplicated: result.docs_written,\n syncTimeMs,\n viewWarmTimeMs\n };\n } catch (e) {\n const errorMsg = e instanceof Error ? e.message : String(e);\n logger.error(\n `[CourseSyncService] Sync failed for course ${courseId}: ${errorMsg}`\n );\n entry.status = { state: \"error\", error: errorMsg };\n entry.readyPromise = null;\n if (entry.localDB) {\n try {\n await entry.localDB.destroy();\n } catch {\n }\n entry.localDB = null;\n }\n }\n }\n /**\n * Check CourseConfig.localSync.enabled on the remote DB.\n */\n async checkLocalSyncEnabled(courseId) {\n try {\n const remoteDB = this.getRemoteDB(courseId);\n const config = await remoteDB.get(\"CourseConfig\");\n return config.localSync?.enabled === true;\n } catch (e) {\n logger.warn(\n `[CourseSyncService] Could not read CourseConfig for ${courseId}, assuming local sync disabled: ${e}`\n );\n return false;\n }\n }\n /**\n * One-shot replication from remote to local.\n */\n replicate(source, target) {\n return new Promise((resolve, reject) => {\n void pouchdb_setup_default.replicate(source, target, {\n // One-shot, not live. Local is a read-only snapshot.\n }).on(\"complete\", (info) => {\n resolve(info);\n }).on(\"error\", (err) => {\n reject(err);\n });\n });\n }\n /**\n * Pre-warm PouchDB view indices by running a minimal query against each\n * design doc. This forces PouchDB to build the MapReduce index now\n * (during a loading phase) rather than on first pipeline query.\n */\n async warmViewIndices(localDB) {\n const viewsToWarm = [\"elo\", \"getTags\"];\n for (const viewName of viewsToWarm) {\n try {\n await localDB.query(viewName, { limit: 1 });\n logger.debug(\n `[CourseSyncService] Warmed view index: ${viewName}`\n );\n } catch (e) {\n logger.debug(\n `[CourseSyncService] Could not warm view ${viewName}: ${e}`\n );\n }\n }\n }\n /**\n * Check whether the local replica's `db-epoch` doc matches the remote.\n *\n * The seed script (and optionally upload-cards) writes a `db-epoch`\n * document with a numeric timestamp. If the remote epoch differs from\n * the local copy, the remote DB was recreated (e.g., `yarn db:seed`)\n * and the local PouchDB is stale.\n *\n * Returns `true` if stale (epoch mismatch or remote has epoch but local\n * doesn't). Returns `false` (not stale) if epochs match, or if the\n * remote doesn't have an epoch doc at all (backwards compat).\n */\n async isLocalEpochStale(courseId, localDB) {\n try {\n const remoteDB = this.getRemoteDB(courseId);\n const remoteEpoch = await remoteDB.get(\"db-epoch\");\n let localEpoch = null;\n try {\n localEpoch = await localDB.get(\"db-epoch\");\n } catch {\n return true;\n }\n return remoteEpoch.epoch !== localEpoch.epoch;\n } catch {\n return false;\n }\n }\n /**\n * Get a remote PouchDB handle for a course.\n */\n getRemoteDB(courseId) {\n return getCourseDB2(courseId);\n }\n /**\n * Local DB naming convention.\n */\n localDBName(courseId) {\n return `coursedb-local-${courseId}`;\n }\n };\n }\n});\n\n// src/impl/couch/auth.ts\nimport fetch2 from \"cross-fetch\";\nasync function getCurrentSession() {\n try {\n if (ENV.COUCHDB_SERVER_URL === NOT_SET || ENV.COUCHDB_SERVER_PROTOCOL === NOT_SET) {\n throw new Error(`CouchDB server configuration not properly initialized. Protocol: \"${ENV.COUCHDB_SERVER_PROTOCOL}\", URL: \"${ENV.COUCHDB_SERVER_URL}\"`);\n }\n const baseUrl = ENV.COUCHDB_SERVER_URL.endsWith(\"/\") ? ENV.COUCHDB_SERVER_URL.slice(0, -1) : ENV.COUCHDB_SERVER_URL;\n const url = `${ENV.COUCHDB_SERVER_PROTOCOL}://${baseUrl}/_session`;\n logger.debug(`Attempting session check at: ${url}`);\n const response = await fetch2(url, {\n method: \"GET\",\n credentials: \"include\"\n });\n if (!response.ok) {\n throw new Error(`Session check failed: ${response.status}`);\n }\n const resp = await response.json();\n return resp;\n } catch (error) {\n const baseUrl = ENV.COUCHDB_SERVER_URL.endsWith(\"/\") ? ENV.COUCHDB_SERVER_URL.slice(0, -1) : ENV.COUCHDB_SERVER_URL;\n const url = `${ENV.COUCHDB_SERVER_PROTOCOL}://${baseUrl}/_session`;\n logger.error(`Session check error attempting to connect to: ${url} - ${error}`);\n throw new Error(`Session check failed connecting to ${url}: ${error}`);\n }\n}\nasync function getLoggedInUsername() {\n const session = await getCurrentSession();\n if (session.userCtx.name && session.userCtx.name !== \"\") {\n return session.userCtx.name;\n }\n throw new Error(\"No logged in user\");\n}\nvar init_auth = __esm({\n \"src/impl/couch/auth.ts\"() {\n \"use strict\";\n init_factory();\n init_logger();\n }\n});\n\n// src/impl/couch/CouchDBSyncStrategy.ts\nvar CouchDBSyncStrategy_exports = {};\n__export(CouchDBSyncStrategy_exports, {\n CouchDBSyncStrategy: () => CouchDBSyncStrategy\n});\nimport { Status as Status2 } from \"@vue-skuilder/common\";\nvar log3, CouchDBSyncStrategy;\nvar init_CouchDBSyncStrategy = __esm({\n \"src/impl/couch/CouchDBSyncStrategy.ts\"() {\n \"use strict\";\n init_factory();\n init_types_legacy();\n init_logger();\n init_common();\n init_pouchdb_setup();\n init_couch();\n init_auth();\n log3 = (s) => {\n logger.info(s);\n };\n CouchDBSyncStrategy = class {\n syncHandle;\n // Handle to cancel sync if needed\n setupRemoteDB(username) {\n if (username === GuestUsername || username.startsWith(GuestUsername)) {\n return getLocalUserDB(username);\n } else {\n return this.getUserDB(username);\n }\n }\n getWriteDB(username) {\n if (username === GuestUsername || username.startsWith(GuestUsername)) {\n return getLocalUserDB(username);\n } else {\n return this.getUserDB(username);\n }\n }\n startSync(localDB, remoteDB) {\n if (localDB !== remoteDB) {\n this.syncHandle = pouchdb_setup_default.sync(localDB, remoteDB, {\n live: true,\n retry: true\n });\n }\n }\n stopSync() {\n if (this.syncHandle) {\n this.syncHandle.cancel();\n this.syncHandle = void 0;\n }\n }\n canCreateAccount() {\n return true;\n }\n canAuthenticate() {\n return true;\n }\n async createAccount(username, password) {\n const funnelUsername = await this.getCurrentUsername();\n const isFunnelAccount = funnelUsername.startsWith(GuestUsername);\n if (isFunnelAccount) {\n logger.info(`Creating account for funnel user ${funnelUsername} -> ${username}`);\n }\n try {\n const signupRequest = await this.getRemoteCouchRootDB().signUp(username, password);\n if (signupRequest.ok) {\n log3(`CREATEACCOUNT: Successfully created account for ${username}`);\n try {\n const logoutResult = await this.getRemoteCouchRootDB().logOut();\n log3(`CREATEACCOUNT: logged out: ${logoutResult.ok}`);\n } catch {\n }\n const loginResult = await this.getRemoteCouchRootDB().logIn(username, password);\n log3(`CREATEACCOUNT: logged in as new user: ${loginResult.ok}`);\n if (loginResult.ok) {\n if (isFunnelAccount) {\n logger.info(`Migrating data from funnel account ${funnelUsername} to ${username}`);\n const migrationResult = await this.migrateFunnelData(funnelUsername, username);\n if (!migrationResult.success) {\n logger.warn(`Migration failed: ${migrationResult.error}`);\n }\n }\n return {\n status: Status2.ok,\n error: void 0\n };\n } else {\n return {\n status: Status2.error,\n error: \"Failed to log in after account creation\"\n };\n }\n } else {\n logger.warn(`Signup not OK: ${JSON.stringify(signupRequest)}`);\n return {\n status: Status2.error,\n error: \"Account creation failed\"\n };\n }\n } catch (e) {\n if (e.reason === \"Document update conflict.\") {\n return {\n status: Status2.error,\n error: \"This username is taken!\"\n };\n }\n logger.error(`Error on signup: ${JSON.stringify(e)}`);\n return {\n status: Status2.error,\n error: e.message || \"Unknown error during account creation\"\n };\n }\n }\n async authenticate(username, password) {\n try {\n const loginResult = await this.getRemoteCouchRootDB().logIn(username, password);\n if (loginResult.ok) {\n log3(`Successfully logged in as ${username}`);\n return {\n ok: true\n };\n } else {\n log3(`Login failed for ${username}`);\n return {\n ok: false,\n error: \"Invalid username or password\"\n };\n }\n } catch (error) {\n logger.error(`Authentication error for ${username}:`, error);\n return {\n ok: false,\n error: error.message || \"Authentication failed\"\n };\n }\n }\n async logout() {\n try {\n const result = await this.getRemoteCouchRootDB().logOut();\n return {\n ok: result.ok,\n error: result.ok ? void 0 : \"Logout failed\"\n };\n } catch (error) {\n logger.error(\"Logout error:\", error);\n return {\n ok: false,\n error: error.message || \"Logout failed\"\n };\n }\n }\n async getCurrentUsername() {\n logger.log(\"[funnel] CouchDBSyncStrategy.getCurrentUsername() called\");\n try {\n const loggedInUsername = await getLoggedInUsername();\n logger.log(\"[funnel] getLoggedInUsername() returned:\", loggedInUsername);\n return loggedInUsername;\n } catch (e) {\n logger.log(\"[funnel] getLoggedInUsername() failed, calling accomodateGuest()\");\n logger.log(\"[funnel] Error was:\", e);\n const guestInfo = accomodateGuest();\n logger.log(\"[funnel] accomodateGuest() returned:\", guestInfo);\n return guestInfo.username;\n }\n }\n /**\n * Migrate data from funnel account to real account\n */\n async migrateFunnelData(oldUsername, newUsername) {\n try {\n logger.info(`Starting data migration from ${oldUsername} to ${newUsername}`);\n const oldLocalDB = getLocalUserDB(oldUsername);\n const newLocalDB = getLocalUserDB(newUsername);\n const allDocs = await oldLocalDB.allDocs({ include_docs: true });\n logger.info(`Found ${allDocs.rows.length} documents in funnel account`);\n const docsToMigrate = allDocs.rows.filter((row) => !row.id.startsWith(\"_design/\")).map((row) => ({\n ...row.doc,\n _rev: void 0\n // Remove rev to insert as new\n }));\n if (docsToMigrate.length > 0) {\n await newLocalDB.bulkDocs(docsToMigrate);\n logger.info(`Successfully migrated ${docsToMigrate.length} documents from ${oldUsername} to ${newUsername}`);\n } else {\n logger.info(\"No documents to migrate from funnel account\");\n }\n return { success: true };\n } catch (error) {\n logger.error(\"Migration failed:\", error);\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\"\n };\n }\n }\n /**\n * Get remote CouchDB root database for authentication operations\n */\n getRemoteCouchRootDB() {\n const remoteStr = ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + \"skuilder\";\n try {\n return new pouchdb_setup_default(remoteStr, {\n skip_setup: true\n });\n } catch (error) {\n logger.error(\"Failed to initialize remote CouchDB connection:\", error);\n throw new Error(`Failed to initialize CouchDB: ${JSON.stringify(error)}`);\n }\n }\n /**\n * Get remote user database for a specific user\n */\n getUserDB(username) {\n const guestAccount = false;\n const hexName = hexEncode(username);\n const dbName = `userdb-${hexName}`;\n log3(`Fetching user database: ${dbName} (${username})`);\n const ret = new pouchdb_setup_default(\n ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + dbName,\n createPouchDBConfig()\n );\n if (guestAccount) {\n updateGuestAccountExpirationDate(ret);\n }\n return ret;\n }\n };\n }\n});\n\n// src/impl/couch/index.ts\nimport fetch3 from \"cross-fetch\";\nimport moment5 from \"moment\";\nimport process2 from \"process\";\nfunction createPouchDBConfig() {\n const hasExplicitCredentials = ENV.COUCHDB_USERNAME && ENV.COUCHDB_PASSWORD;\n const isNodeEnvironment = typeof window === \"undefined\";\n if (hasExplicitCredentials && isNodeEnvironment) {\n return {\n fetch(url, opts = {}) {\n const basicAuth = btoa(`${ENV.COUCHDB_USERNAME}:${ENV.COUCHDB_PASSWORD}`);\n const headers = new Headers(opts.headers || {});\n headers.set(\"Authorization\", `Basic ${basicAuth}`);\n const newOpts = {\n ...opts,\n headers\n };\n return pouchdb_setup_default.fetch(url, newOpts);\n }\n };\n }\n return pouchDBincludeCredentialsConfig;\n}\nfunction getCourseDB2(courseID) {\n return new pouchdb_setup_default(\n ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + \"coursedb-\" + courseID,\n createPouchDBConfig()\n );\n}\nfunction filterAllDocsByPrefix2(db, prefix, opts) {\n const options = {\n startkey: prefix,\n endkey: prefix + \"\\uFFF0\",\n include_docs: true\n };\n if (opts) {\n Object.assign(options, opts);\n }\n return db.allDocs(options);\n}\nfunction getStartAndEndKeys2(key) {\n return {\n startkey: key,\n endkey: key + \"\\uFFF0\"\n };\n}\nvar isBrowser, GUEST_LOCAL_DB, localUserDB, pouchDBincludeCredentialsConfig, REVIEW_TIME_FORMAT2;\nvar init_couch = __esm({\n \"src/impl/couch/index.ts\"() {\n \"use strict\";\n init_factory();\n init_types_legacy();\n init_logger();\n init_pouchdb_setup();\n init_contentSource();\n init_adminDB2();\n init_classroomDB2();\n init_courseAPI();\n init_courseDB();\n init_CourseSyncService();\n init_CouchDBSyncStrategy();\n isBrowser = typeof window !== \"undefined\";\n if (isBrowser) {\n window.process = process2;\n }\n GUEST_LOCAL_DB = `userdb-${GuestUsername}`;\n localUserDB = new pouchdb_setup_default(GUEST_LOCAL_DB);\n pouchDBincludeCredentialsConfig = {\n fetch(url, opts) {\n opts.credentials = \"include\";\n return pouchdb_setup_default.fetch(url, opts);\n }\n };\n REVIEW_TIME_FORMAT2 = \"YYYY-MM-DD--kk:mm:ss-SSS\";\n }\n});\n\n// src/impl/common/BaseUserDB.ts\nimport { Status as Status3 } from \"@vue-skuilder/common\";\nimport moment6 from \"moment\";\nfunction accomodateGuest() {\n logger.log(\"[funnel] accomodateGuest() called\");\n if (typeof localStorage === \"undefined\") {\n logger.log(\n \"[funnel] localStorage not available (Node.js environment), returning default guest\"\n );\n return {\n username: GuestUsername + \"nodejs-test\",\n firstVisit: true\n };\n }\n const dbUUID = \"sk-guest-uuid\";\n let firstVisit;\n const existingUUID = localStorage.getItem(dbUUID);\n logger.log(\"[funnel] Checking localStorage for key:\", dbUUID);\n logger.log(\"[funnel] Existing UUID value:\", existingUUID);\n logger.log(\"[funnel] existingUUID !== null:\", existingUUID !== null);\n if (existingUUID !== null) {\n firstVisit = false;\n logger.log(`[funnel] Returning guest ${existingUUID} \"logging in\".`);\n } else {\n firstVisit = true;\n logger.log(\"[funnel] No existing UUID, generating new one...\");\n const uuid = generateUUID();\n logger.log(\"[funnel] Generated UUID:\", uuid);\n logger.log(\"[funnel] UUID length:\", uuid.length);\n try {\n localStorage.setItem(dbUUID, uuid);\n logger.log(\"[funnel] Successfully stored UUID in localStorage\");\n const verification = localStorage.getItem(dbUUID);\n logger.log(\"[funnel] Verification read from localStorage:\", verification);\n } catch (e) {\n logger.error(\"[funnel] ERROR storing UUID:\", e);\n }\n logger.log(`[funnel] Accommodating a new guest with account: ${uuid}`);\n }\n const finalUUID = localStorage.getItem(dbUUID);\n const finalUsername = GuestUsername + finalUUID;\n logger.log(\"[funnel] Final UUID from localStorage:\", finalUUID);\n logger.log(\"[funnel] GuestUsername constant:\", GuestUsername);\n logger.log(\"[funnel] Final username to return:\", finalUsername);\n return {\n username: finalUsername,\n firstVisit\n };\n function generateUUID() {\n logger.log(\"[funnel] Inside generateUUID()\");\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n const uuid2 = crypto.randomUUID();\n logger.log(\"[funnel] Generated UUID using crypto.randomUUID():\", uuid2);\n return uuid2;\n }\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n bytes[6] = bytes[6] & 15 | 64;\n bytes[8] = bytes[8] & 63 | 128;\n const uuid2 = [\n Array.from(bytes.slice(0, 4)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\"),\n Array.from(bytes.slice(4, 6)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\"),\n Array.from(bytes.slice(6, 8)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\"),\n Array.from(bytes.slice(8, 10)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\"),\n Array.from(bytes.slice(10, 16)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\")\n ].join(\"-\");\n logger.log(\"[funnel] Generated UUID using crypto.getRandomValues():\", uuid2);\n return uuid2;\n }\n logger.warn(\"[funnel] crypto API not available, using timestamp-based UUID (NOT SECURE)\");\n let d = (/* @__PURE__ */ new Date()).getTime();\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n d += performance.now();\n }\n const uuid = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (d + Math.random() * 16) % 16 | 0;\n d = Math.floor(d / 16);\n return (c === \"x\" ? r : r & 3 | 8).toString(16);\n });\n logger.log(\"[funnel] Generated UUID (fallback):\", uuid);\n return uuid;\n }\n}\nasync function getOrCreateClassroomRegistrationsDoc(user) {\n let ret;\n try {\n ret = await getLocalUserDB(user).get(userClassroomsDoc);\n } catch (e) {\n const err = e;\n if (err.status === 404) {\n await getLocalUserDB(user).put({\n _id: userClassroomsDoc,\n registrations: []\n });\n ret = await getOrCreateClassroomRegistrationsDoc(user);\n } else {\n const errorDetails = {\n name: err.name,\n status: err.status,\n message: err.message,\n reason: err.reason,\n error: err.error\n };\n logger.error(\n \"Database error in getOrCreateClassroomRegistrationsDoc (standalone function):\",\n errorDetails\n );\n throw new Error(\n `Database error accessing classroom registrations: ${err.message || err.name || \"Unknown error\"} (status: ${err.status})`\n );\n }\n }\n return ret;\n}\nasync function getOrCreateCourseRegistrationsDoc(user) {\n let ret;\n try {\n ret = await getLocalUserDB(user).get(userCoursesDoc);\n } catch (e) {\n const err = e;\n if (err.status === 404) {\n await getLocalUserDB(user).put({\n _id: userCoursesDoc,\n courses: [],\n studyWeight: {}\n });\n ret = await getOrCreateCourseRegistrationsDoc(user);\n } else {\n throw new Error(\n `Unexpected error ${JSON.stringify(e)} in getOrCreateCourseRegistrationDoc...`\n );\n }\n }\n return ret;\n}\nasync function updateUserElo(user, course_id, elo) {\n const regDoc = await getOrCreateCourseRegistrationsDoc(user);\n const course = regDoc.courses.find((c) => c.courseID === course_id);\n course.elo = elo;\n return getLocalUserDB(user).put(regDoc);\n}\nasync function registerUserForClassroom(user, classID, registerAs) {\n log4(`Registering user: ${user} in course: ${classID}`);\n return getOrCreateClassroomRegistrationsDoc(user).then((doc) => {\n const regItem = {\n classID,\n registeredAs: registerAs\n };\n if (doc.registrations.filter((reg) => {\n return reg.classID === regItem.classID && reg.registeredAs === regItem.registeredAs;\n }).length === 0) {\n doc.registrations.push(regItem);\n } else {\n log4(`User ${user} is already registered for class ${classID}`);\n }\n return getLocalUserDB(user).put(doc);\n });\n}\nasync function dropUserFromClassroom(user, classID) {\n return getOrCreateClassroomRegistrationsDoc(user).then((doc) => {\n let index = -1;\n for (let i = 0; i < doc.registrations.length; i++) {\n if (doc.registrations[i].classID === classID) {\n index = i;\n }\n }\n if (index !== -1) {\n doc.registrations.splice(index, 1);\n }\n return getLocalUserDB(user).put(doc);\n });\n}\nasync function getUserClassrooms(user) {\n return getOrCreateClassroomRegistrationsDoc(user);\n}\nvar log4, BaseUser, userCoursesDoc, userClassroomsDoc;\nvar init_BaseUserDB = __esm({\n \"src/impl/common/BaseUserDB.ts\"() {\n \"use strict\";\n init_core();\n init_util();\n init_types_legacy();\n init_logger();\n init_userDBHelpers();\n init_updateQueue();\n init_user_course_relDB();\n init_couch();\n log4 = (s) => {\n logger.info(s);\n };\n BaseUser = class _BaseUser {\n static _instance;\n static _initialized = false;\n static Dummy(syncStrategy) {\n return new _BaseUser(\"Me\", syncStrategy);\n }\n static DOC_IDS = {\n CONFIG: \"CONFIG\",\n COURSE_REGISTRATIONS: \"CourseRegistrations\",\n CLASSROOM_REGISTRATIONS: \"ClassroomRegistrations\"\n };\n // private email: string;\n _username;\n syncStrategy;\n getUsername() {\n return this._username;\n }\n isLoggedIn() {\n return !this._username.startsWith(GuestUsername);\n }\n remote() {\n return this.remoteDB;\n }\n localDB;\n remoteDB;\n writeDB;\n // Database to use for write operations (local-first approach)\n updateQueue;\n async createAccount(username, password) {\n if (!this.syncStrategy.canCreateAccount()) {\n throw new Error(\"Account creation not supported by current sync strategy\");\n }\n if (!this._username.startsWith(GuestUsername)) {\n throw new Error(\n `Cannot create a new account while logged in:\nCurrently logged-in as ${this._username}.`\n );\n }\n const result = await this.syncStrategy.createAccount(username, password);\n if (result.status === Status3.ok) {\n log4(`Account created successfully, updating username to ${username}`);\n this._username = username;\n try {\n localStorage.removeItem(\"sk-guest-uuid\");\n } catch (e) {\n logger.warn(\"localStorage not available (Node.js environment):\", e);\n }\n await this.init();\n }\n return {\n status: result.status,\n error: result.error || \"\"\n };\n }\n async login(username, password) {\n if (!this.syncStrategy.canAuthenticate()) {\n throw new Error(\"Authentication not supported by current sync strategy\");\n }\n if (!this._username.startsWith(GuestUsername) && this._username != username) {\n if (this._username != username) {\n throw new Error(`Cannot change accounts while logged in.\n Log out of account ${this.getUsername()} before logging in as ${username}.`);\n }\n logger.warn(`User ${this._username} is already logged in, but executing login again.`);\n }\n const loginResult = await this.syncStrategy.authenticate(username, password);\n if (loginResult.ok) {\n log4(`Logged in as ${username}`);\n this._username = username;\n try {\n localStorage.removeItem(\"sk-guest-uuid\");\n } catch (e) {\n logger.warn(\"localStorage not available (Node.js environment):\", e);\n }\n await this.init();\n }\n return loginResult;\n }\n async resetUserData() {\n if (this.syncStrategy.canAuthenticate()) {\n return {\n status: Status3.error,\n error: \"Reset user data is only available for local-only mode. Use logout instead for remote sync.\"\n };\n }\n try {\n const localDB = getLocalUserDB(this._username);\n const allDocs = await localDB.allDocs({ include_docs: false });\n const docsToDelete = allDocs.rows.filter((row) => {\n const id = row.id;\n return id.startsWith(DocTypePrefixes[\"CARDRECORD\" /* CARDRECORD */]) || // Card interaction history\n id.startsWith(DocTypePrefixes[\"SCHEDULED_CARD\" /* SCHEDULED_CARD */]) || // Scheduled reviews\n id.startsWith(DocTypePrefixes[\"STRATEGY_STATE\" /* STRATEGY_STATE */]) || // Strategy state (user prefs, progression)\n id.startsWith(DocTypePrefixes[\"USER_OUTCOME\" /* USER_OUTCOME */]) || // Evolutionary orchestration outcomes\n id.startsWith(DocTypePrefixes[\"STRATEGY_LEARNING_STATE\" /* STRATEGY_LEARNING_STATE */]) || // Strategy learning state\n id === _BaseUser.DOC_IDS.COURSE_REGISTRATIONS || // Course registrations\n id === _BaseUser.DOC_IDS.CLASSROOM_REGISTRATIONS || // Classroom registrations\n id === _BaseUser.DOC_IDS.CONFIG;\n }).map((row) => ({ _id: row.id, _rev: row.value.rev, _deleted: true }));\n if (docsToDelete.length > 0) {\n await localDB.bulkDocs(docsToDelete);\n }\n await this.init();\n return { status: Status3.ok };\n } catch (error) {\n logger.error(\"Failed to reset user data:\", error);\n return {\n status: Status3.error,\n error: error instanceof Error ? error.message : \"Unknown error during reset\"\n };\n }\n }\n async logout() {\n if (!this.syncStrategy.canAuthenticate()) {\n this._username = await this.syncStrategy.getCurrentUsername();\n await this.init();\n return { ok: true };\n }\n const ret = await this.syncStrategy.logout();\n this._username = await this.syncStrategy.getCurrentUsername();\n await this.init();\n return ret;\n }\n async get(id) {\n return this.localDB.get(id);\n }\n update(id, update) {\n return this.updateQueue.update(id, update);\n }\n async getCourseRegistrationsDoc() {\n logger.debug(`Fetching courseRegistrations for ${this.getUsername()}`);\n let ret;\n try {\n const regDoc = await this.localDB.get(\n _BaseUser.DOC_IDS.COURSE_REGISTRATIONS\n );\n return regDoc;\n } catch (e) {\n const err = e;\n if (err.status === 404) {\n await this.localDB.put({\n _id: _BaseUser.DOC_IDS.COURSE_REGISTRATIONS,\n courses: [],\n studyWeight: {}\n });\n ret = await this.getCourseRegistrationsDoc();\n } else {\n throw new Error(\n `Unexpected error ${JSON.stringify(e)} in getOrCreateCourseRegistrationDoc...`\n );\n }\n }\n return ret;\n }\n async getActiveCourses() {\n const reg = await this.getCourseRegistrationsDoc();\n return reg.courses.filter((c) => {\n return c.status === void 0 || c.status === \"active\";\n });\n }\n /**\n * Returns a promise of the card IDs that the user has\n * a scheduled review for.\n *\n */\n async getActiveCards() {\n const keys = getStartAndEndKeys(DocTypePrefixes[\"SCHEDULED_CARD\" /* SCHEDULED_CARD */]);\n const reviews = await this.remoteDB.allDocs({\n startkey: keys.startkey,\n endkey: keys.endkey,\n include_docs: true\n });\n return reviews.rows.map((r) => {\n return {\n courseID: r.doc.courseId,\n cardID: r.doc.cardId\n };\n });\n }\n async getActivityRecords() {\n try {\n const hist = await this.getHistory();\n const allRecords = [];\n if (!Array.isArray(hist)) {\n logger.error(\"getHistory did not return an array:\", hist);\n return allRecords;\n }\n let sampleCount = 0;\n for (let i = 0; i < hist.length; i++) {\n try {\n if (hist[i] && Array.isArray(hist[i].records)) {\n hist[i].records.forEach((record) => {\n try {\n if (!record.timeStamp) {\n return;\n }\n let timeStamp;\n if (typeof record.timeStamp === \"object\") {\n if (typeof record.timeStamp.toDate === \"function\") {\n timeStamp = record.timeStamp.toISOString();\n } else if (record.timeStamp instanceof Date) {\n timeStamp = record.timeStamp.toISOString();\n } else {\n if (sampleCount < 3) {\n logger.warn(\"Unknown timestamp object type:\", record.timeStamp);\n sampleCount++;\n }\n return;\n }\n } else if (typeof record.timeStamp === \"string\") {\n const date = new Date(record.timeStamp);\n if (isNaN(date.getTime())) {\n return;\n }\n timeStamp = record.timeStamp;\n } else if (typeof record.timeStamp === \"number\") {\n timeStamp = new Date(record.timeStamp).toISOString();\n } else {\n return;\n }\n allRecords.push({\n timeStamp,\n courseID: record.courseID || \"unknown\",\n cardID: record.cardID || \"unknown\",\n timeSpent: record.timeSpent || 0,\n type: \"card_view\"\n });\n } catch (err) {\n }\n });\n }\n } catch (err) {\n logger.error(\"Error processing history item:\", err);\n }\n }\n logger.debug(`Found ${allRecords.length} activity records`);\n return allRecords;\n } catch (err) {\n logger.error(\"Error in getActivityRecords:\", err);\n return [];\n }\n }\n async getReviewstoDate(targetDate, course_id) {\n const keys = getStartAndEndKeys(DocTypePrefixes[\"SCHEDULED_CARD\" /* SCHEDULED_CARD */]);\n const reviews = await this.remoteDB.allDocs({\n startkey: keys.startkey,\n endkey: keys.endkey,\n include_docs: true\n });\n log4(\n `Fetching ${this._username}'s scheduled reviews${course_id ? ` for course ${course_id}` : \"\"}.`\n );\n return reviews.rows.filter((r) => {\n if (r.id.startsWith(DocTypePrefixes[\"SCHEDULED_CARD\" /* SCHEDULED_CARD */])) {\n const date = moment6.utc(\n r.id.substr(DocTypePrefixes[\"SCHEDULED_CARD\" /* SCHEDULED_CARD */].length),\n REVIEW_TIME_FORMAT\n );\n if (targetDate.isAfter(date)) {\n if (course_id === void 0 || r.doc.courseId === course_id) {\n return true;\n }\n }\n }\n }).map((r) => r.doc);\n }\n async getReviewsForcast(daysCount) {\n const time = moment6.utc().add(daysCount, \"days\");\n return this.getReviewstoDate(time);\n }\n async getPendingReviews(course_id) {\n const now = moment6.utc();\n return this.getReviewstoDate(now, course_id);\n }\n async getScheduledReviewCount(course_id) {\n return (await this.getPendingReviews(course_id)).length;\n }\n async getRegisteredCourses() {\n const regDoc = await this.getCourseRegistrationsDoc();\n return regDoc.courses.filter((c) => {\n return !c.status || c.status === \"active\" || c.status === \"maintenance-mode\";\n });\n }\n async getCourseRegDoc(courseID) {\n const regDocs = await this.getCourseRegistrationsDoc();\n const ret = regDocs.courses.find((c) => c.courseID === courseID);\n if (ret) {\n return ret;\n } else {\n throw new Error(`Course registration not found for course ID: ${courseID}`);\n }\n }\n async registerForCourse(course_id, previewMode = false) {\n return this.getCourseRegistrationsDoc().then((doc) => {\n const status = previewMode ? \"preview\" : \"active\";\n logger.debug(`Registering for ${course_id} with status: ${status}`);\n const regItem = {\n status,\n courseID: course_id,\n user: true,\n admin: false,\n moderator: false,\n elo: {\n global: {\n score: 1e3,\n count: 0\n },\n tags: {},\n misc: {}\n }\n };\n if (doc.courses.filter((course) => {\n return course.courseID === regItem.courseID;\n }).length === 0) {\n log4(`It's a new course registration!`);\n doc.courses.push(regItem);\n doc.studyWeight[course_id] = 1;\n } else {\n doc.courses.forEach((c) => {\n log4(`Found the previously registered course!`);\n if (c.courseID === course_id) {\n c.status = status;\n }\n });\n }\n return this.localDB.put(doc);\n }).catch((e) => {\n log4(`Registration failed because of: ${JSON.stringify(e)}`);\n throw e;\n });\n }\n async dropCourse(course_id, dropStatus = \"dropped\") {\n return this.getCourseRegistrationsDoc().then((doc) => {\n let index = -1;\n for (let i = 0; i < doc.courses.length; i++) {\n if (doc.courses[i].courseID === course_id) {\n index = i;\n }\n }\n if (index !== -1) {\n delete doc.studyWeight[course_id];\n doc.courses[index].status = dropStatus;\n } else {\n throw new Error(\n `User ${this.getUsername()} is not currently registered for course ${course_id}`\n );\n }\n return this.localDB.put(doc);\n });\n }\n async getCourseInterface(courseId) {\n return new UsrCrsData(this, courseId);\n }\n async getUserEditableCourses() {\n let courseIDs = [];\n const registeredCourses = await this.getCourseRegistrationsDoc();\n courseIDs = courseIDs.concat(\n registeredCourses.courses.map((course) => {\n return course.courseID;\n })\n );\n const cfgs = await Promise.all(\n courseIDs.map(async (id) => {\n return await getCredentialledCourseConfig(id);\n })\n );\n return cfgs;\n }\n async getConfig() {\n const defaultConfig = {\n _id: _BaseUser.DOC_IDS.CONFIG,\n darkMode: false,\n likesConfetti: false,\n sessionTimeLimit: 5\n };\n try {\n const cfg = await this.localDB.get(_BaseUser.DOC_IDS.CONFIG);\n logger.debug(\"Raw config from DB:\", cfg);\n return cfg;\n } catch (e) {\n const err = e;\n if (err.name && err.name === \"not_found\") {\n await this.localDB.put(defaultConfig);\n return this.getConfig();\n } else {\n logger.error(`Error setting user default config:`, e);\n throw new Error(`Error returning the user's configuration: ${JSON.stringify(e)}`);\n }\n }\n }\n async setConfig(items) {\n logger.debug(`Setting Config items ${JSON.stringify(items)}`);\n const c = await this.getConfig();\n const put = await this.localDB.put({\n ...c,\n ...items\n });\n if (put.ok) {\n logger.debug(`Config items set: ${JSON.stringify(items)}`);\n } else {\n logger.error(`Error setting config items: ${JSON.stringify(put)}`);\n }\n }\n /**\n *\n * This function should be called *only* by the pouchdb datalayer provider\n * auth store.\n *\n *\n * Anyone else seeking the current user should use the auth store's\n * exported `getCurrentUser` method.\n *\n */\n static async instance(syncStrategy, username) {\n if (username) {\n _BaseUser._instance = new _BaseUser(username, syncStrategy);\n await _BaseUser._instance.init();\n return _BaseUser._instance;\n } else if (_BaseUser._instance && _BaseUser._initialized) {\n return _BaseUser._instance;\n } else if (_BaseUser._instance) {\n return new Promise((resolve) => {\n (function waitForUser() {\n if (_BaseUser._initialized) {\n return resolve(_BaseUser._instance);\n } else {\n setTimeout(waitForUser, 50);\n }\n })();\n });\n } else {\n const guestUsername = await syncStrategy.getCurrentUsername();\n _BaseUser._instance = new _BaseUser(guestUsername, syncStrategy);\n await _BaseUser._instance.init();\n return _BaseUser._instance;\n }\n }\n constructor(username, syncStrategy) {\n _BaseUser._initialized = false;\n this._username = username;\n this.syncStrategy = syncStrategy;\n this.setDBandQ();\n }\n setDBandQ() {\n this.localDB = getLocalUserDB(this._username);\n this.remoteDB = this.syncStrategy.setupRemoteDB(this._username);\n this.writeDB = this.syncStrategy.getWriteDB ? this.syncStrategy.getWriteDB(this._username) : this.localDB;\n this.updateQueue = new UpdateQueue(this.localDB, this.writeDB);\n }\n async init() {\n _BaseUser._initialized = false;\n if (this._username === \"admin\") {\n _BaseUser._initialized = true;\n return;\n }\n this.setDBandQ();\n this.syncStrategy.startSync(this.localDB, this.remoteDB);\n this.applyDesignDocs().catch((error) => {\n log4(`Error in applyDesignDocs background task: ${error}`);\n if (error && typeof error === \"object\") {\n log4(`Full error details in applyDesignDocs: ${JSON.stringify(error)}`);\n }\n });\n this.deduplicateReviews().catch((error) => {\n log4(`Error in deduplicateReviews background task: ${error}`);\n if (error && typeof error === \"object\") {\n log4(`Full error details in background task: ${JSON.stringify(error)}`);\n }\n });\n _BaseUser._initialized = true;\n }\n static designDocs = [\n {\n _id: \"_design/reviewCards\",\n views: {\n reviewCards: {\n map: `function (doc) {\n if (doc._id && doc._id.indexOf('card_review') === 0 && doc.courseId && doc.cardId) {\n emit(doc._id, doc.courseId + '-' + doc.cardId);\n }\n }`\n }\n }\n }\n ];\n async applyDesignDocs() {\n log4(`Starting applyDesignDocs for user: ${this._username}`);\n log4(`Remote DB name: ${this.remoteDB.name || \"unknown\"}`);\n if (this._username === \"admin\") {\n log4(\"Skipping design docs for admin user\");\n return;\n }\n log4(`Applying ${_BaseUser.designDocs.length} design docs`);\n for (const doc of _BaseUser.designDocs) {\n log4(`Applying design doc: ${doc._id}`);\n try {\n try {\n const existingDoc = await this.remoteDB.get(doc._id);\n await this.remoteDB.put({\n ...doc,\n _rev: existingDoc._rev\n });\n } catch (e) {\n if (e instanceof Error && e.name === \"not_found\") {\n await this.remoteDB.put(doc);\n } else {\n throw e;\n }\n }\n } catch (error) {\n if (error.name && error.name === \"conflict\") {\n logger.warn(`Design doc ${doc._id} update conflict - will retry`);\n await new Promise((resolve) => setTimeout(resolve, 1e3));\n await this.applyDesignDoc(doc);\n } else {\n logger.error(`Failed to apply design doc ${doc._id}:`, error);\n throw error;\n }\n }\n }\n }\n // Helper method for single doc update with retry\n async applyDesignDoc(doc, retries = 3) {\n try {\n const existingDoc = await this.remoteDB.get(doc._id);\n await this.remoteDB.put({\n ...doc,\n _rev: existingDoc._rev\n });\n } catch (e) {\n if (e instanceof Error && e.name === \"conflict\" && retries > 0) {\n await new Promise((resolve) => setTimeout(resolve, 1e3));\n return this.applyDesignDoc(doc, retries - 1);\n }\n throw e;\n }\n }\n /**\n * Logs a record of the user's interaction with the card and returns the card's\n * up-to-date history.\n *\n * **Automatic Initialization:**\n * If this is the user's first interaction with the card (CardHistory doesn't exist),\n * this method automatically creates the CardHistory document with initial values\n * (lapses: 0, streak: 0, bestInterval: 0).\n *\n * **Error Handling:**\n * - Handles 404 errors by creating initial CardHistory document\n * - Re-throws all other errors from UpdateQueue\n *\n * // [ ] #db-refactor extract to a smaller scope - eg, UserStudySession\n *\n * @param record - The recent recorded interaction between user and card\n * @returns The updated state of the card's CardHistory data\n * @throws Error if document creation fails or non-404 database error occurs\n */\n async putCardRecord(record) {\n const cardHistoryID = getCardHistoryID(record.courseID, record.cardID);\n record.timeStamp = moment6.utc(record.timeStamp).toString();\n try {\n const cardHistory = await this.update(\n cardHistoryID,\n function(h) {\n h.records.push(record);\n h.bestInterval = h.bestInterval || 0;\n h.lapses = h.lapses || 0;\n h.streak = h.streak || 0;\n return h;\n }\n );\n cardHistory.records = cardHistory.records.map((record2) => {\n const ret = {\n ...record2\n };\n ret.timeStamp = moment6.utc(record2.timeStamp);\n return ret;\n });\n return cardHistory;\n } catch (e) {\n const reason = e;\n if (reason.status === 404) {\n try {\n const initCardHistory = {\n _id: cardHistoryID,\n cardID: record.cardID,\n courseID: record.courseID,\n records: [record],\n lapses: 0,\n streak: 0,\n bestInterval: 0\n };\n const putResult = await this.writeDB.put(initCardHistory);\n return { ...initCardHistory, _rev: putResult.rev };\n } catch (creationError) {\n throw new Error(\n `Failed to create CardHistory for ${cardHistoryID}. Reason: ${creationError}`\n );\n }\n } else {\n throw new Error(`putCardRecord failed because of:\n name:${reason.name}\n error: ${reason.error}\n message: ${reason.message}`);\n }\n }\n }\n async deduplicateReviews() {\n try {\n log4(\"Starting deduplication of scheduled reviews...\");\n log4(`Remote DB name: ${this.remoteDB.name || \"unknown\"}`);\n log4(`Write DB name: ${this.writeDB.name || \"unknown\"}`);\n const reviewsMap = {};\n const duplicateDocIds = [];\n log4(\n `Attempting to query remoteDB for reviewCards/reviewCards. Database: ${this.remoteDB.name || \"unknown\"}`\n );\n const scheduledReviews = await this.remoteDB.query(\"reviewCards/reviewCards\");\n log4(`Found ${scheduledReviews.rows.length} scheduled reviews to process`);\n scheduledReviews.rows.forEach((r) => {\n const qualifiedCardId = r.value;\n const docId = r.key;\n if (reviewsMap[qualifiedCardId]) {\n log4(`Found duplicate scheduled review for card: ${qualifiedCardId}`);\n log4(\n `Marking earlier review ${reviewsMap[qualifiedCardId]} for deletion, keeping ${docId}`\n );\n duplicateDocIds.push(reviewsMap[qualifiedCardId]);\n reviewsMap[qualifiedCardId] = docId;\n } else {\n reviewsMap[qualifiedCardId] = docId;\n }\n });\n if (duplicateDocIds.length > 0) {\n log4(`Removing ${duplicateDocIds.length} duplicate reviews...`);\n const deletePromises = duplicateDocIds.map(async (docId) => {\n try {\n const doc = await this.remoteDB.get(docId);\n await this.writeDB.remove(doc);\n log4(`Successfully removed duplicate review: ${docId}`);\n } catch (error) {\n log4(`Failed to remove duplicate review ${docId}: ${error}`);\n }\n });\n await Promise.all(deletePromises);\n log4(`Deduplication complete. Processed ${duplicateDocIds.length} duplicates`);\n } else {\n log4(\"No duplicate reviews found\");\n }\n } catch (error) {\n log4(`Error during review deduplication: ${error}`);\n if (error && typeof error === \"object\" && \"status\" in error && error.status === 404) {\n log4(\n `Database not found (404) during review deduplication. Database: ${this.remoteDB.name || \"unknown\"}`\n );\n log4(\n `This might indicate the user database doesn't exist or the reviewCards view isn't available`\n );\n }\n if (error && typeof error === \"object\") {\n log4(`Full error details: ${JSON.stringify(error)}`);\n }\n }\n }\n /**\n * Returns a promise of the card IDs that the user has\n * encountered in the past.\n *\n * @param course_id optional specification of individual course\n */\n async getSeenCards(course_id) {\n const basePrefix = DocTypePrefixes[\"CARDRECORD\" /* CARDRECORD */];\n let filterPrefix = basePrefix;\n if (course_id) {\n filterPrefix += `-${course_id}-`;\n }\n const docs = await filterAllDocsByPrefix(this.localDB, filterPrefix, {\n include_docs: false\n });\n const ret = [];\n docs.rows.forEach((row) => {\n if (row.id.startsWith(filterPrefix)) {\n ret.push(row.id.substr(filterPrefix.length));\n }\n });\n return ret;\n }\n /**\n *\n * @returns A promise of the cards that the user has seen in the past.\n */\n async getHistory() {\n const cards = await filterAllDocsByPrefix(\n this.remoteDB,\n DocTypePrefixes[\"CARDRECORD\" /* CARDRECORD */],\n {\n include_docs: true,\n attachments: false\n }\n );\n return cards.rows.map((r) => r.doc);\n }\n async updateCourseSettings(course_id, settings) {\n void this.getCourseRegistrationsDoc().then((doc) => {\n const crs = doc.courses.find((c) => c.courseID === course_id);\n if (crs) {\n if (crs.settings === null || crs.settings === void 0) {\n crs.settings = {};\n }\n settings.forEach((setting) => {\n crs.settings[setting.key] = setting.value;\n });\n }\n return this.localDB.put(doc);\n });\n }\n async getCourseSettings(course_id) {\n const regDoc = await this.getCourseRegistrationsDoc();\n const crsDoc = regDoc.courses.find((c) => c.courseID === course_id);\n if (crsDoc) {\n return crsDoc.settings;\n } else {\n throw new Error(`getCourseSettings Failed:\n User is not registered for course ${course_id}`);\n }\n }\n async getOrCreateClassroomRegistrationsDoc() {\n let ret;\n try {\n ret = await this.remoteDB.get(\n _BaseUser.DOC_IDS.CLASSROOM_REGISTRATIONS\n );\n } catch (e) {\n const err = e;\n if (err.status === 404) {\n await this.writeDB.put({\n _id: _BaseUser.DOC_IDS.CLASSROOM_REGISTRATIONS,\n registrations: []\n });\n ret = await this.getOrCreateClassroomRegistrationsDoc();\n } else {\n const errorDetails = {\n name: err.name,\n status: err.status,\n message: err.message,\n reason: err.reason,\n error: err.error\n };\n logger.error(\n \"Database error in getOrCreateClassroomRegistrationsDoc (private method):\",\n errorDetails\n );\n throw new Error(\n `Database error accessing classroom registrations: ${err.message || err.name || \"Unknown error\"} (status: ${err.status})`\n );\n }\n }\n logger.debug(`Returning classroom registrations doc: ${JSON.stringify(ret)}`);\n return ret;\n }\n /**\n * Retrieves the list of active classroom IDs where the user is registered as a student.\n *\n * @returns Promise<string[]> - Array of classroom IDs, or empty array if classroom\n * registration document is unavailable due to database errors\n *\n * @description This method gracefully handles database connectivity issues by returning\n * an empty array when the classroom registrations document cannot be accessed.\n * This ensures that users can still access other application features even\n * when classroom functionality is temporarily unavailable.\n */\n async getActiveClasses() {\n try {\n return (await this.getOrCreateClassroomRegistrationsDoc()).registrations.filter((c) => c.registeredAs === \"student\").map((c) => c.classID);\n } catch (error) {\n logger.warn(\n \"Failed to load classroom registrations, continuing without classroom data:\",\n error\n );\n return [];\n }\n }\n async scheduleCardReview(review) {\n return scheduleCardReviewLocal(this.writeDB, review);\n }\n async removeScheduledCardReview(reviewId) {\n return removeScheduledCardReviewLocal(this.writeDB, reviewId);\n }\n async registerForClassroom(_classId, _registerAs) {\n return registerUserForClassroom(this._username, _classId, _registerAs);\n }\n async dropFromClassroom(classId) {\n return dropUserFromClassroom(this._username, classId);\n }\n async getUserClassrooms() {\n return getUserClassrooms(this._username);\n }\n async updateUserElo(courseId, elo) {\n return updateUserElo(this._username, courseId, elo);\n }\n async getStrategyState(courseId, strategyKey) {\n const docId = buildStrategyStateId(courseId, strategyKey);\n try {\n const doc = await this.localDB.get(docId);\n return doc.data;\n } catch (e) {\n const err = e;\n if (err.status === 404) {\n return null;\n }\n throw e;\n }\n }\n async putStrategyState(courseId, strategyKey, data) {\n const docId = buildStrategyStateId(courseId, strategyKey);\n let existingRev;\n try {\n const existing = await this.localDB.get(docId);\n existingRev = existing._rev;\n } catch (e) {\n const err = e;\n if (err.status !== 404) {\n throw e;\n }\n }\n const doc = {\n _id: docId,\n _rev: existingRev,\n docType: \"STRATEGY_STATE\" /* STRATEGY_STATE */,\n courseId,\n strategyKey,\n data,\n updatedAt: (/* @__PURE__ */ new Date()).toISOString()\n };\n await this.localDB.put(doc);\n }\n async putUserOutcome(record) {\n try {\n await this.localDB.put(record);\n } catch (err) {\n if (err.status === 409) {\n const existing = await this.localDB.get(record._id);\n record._rev = existing._rev;\n await this.localDB.put(record);\n } else {\n throw err;\n }\n }\n }\n async deleteStrategyState(courseId, strategyKey) {\n const docId = buildStrategyStateId(courseId, strategyKey);\n try {\n const doc = await this.localDB.get(docId);\n await this.localDB.remove(doc);\n } catch (e) {\n const err = e;\n if (err.status === 404) {\n return;\n }\n throw e;\n }\n }\n };\n userCoursesDoc = \"CourseRegistrations\";\n userClassroomsDoc = \"ClassroomRegistrations\";\n }\n});\n\n// src/impl/common/index.ts\nvar init_common = __esm({\n \"src/impl/common/index.ts\"() {\n \"use strict\";\n init_SyncStrategy();\n init_BaseUserDB();\n init_userDBHelpers();\n }\n});\n\n// src/impl/couch/PouchDataLayerProvider.ts\nvar PouchDataLayerProvider_exports = {};\n__export(PouchDataLayerProvider_exports, {\n CouchDataLayerProvider: () => CouchDataLayerProvider\n});\nvar CouchDataLayerProvider;\nvar init_PouchDataLayerProvider = __esm({\n \"src/impl/couch/PouchDataLayerProvider.ts\"() {\n \"use strict\";\n init_logger();\n init_dataDirectory();\n init_auth();\n init_adminDB2();\n init_classroomDB2();\n init_courseDB();\n init_CourseSyncService();\n init_common();\n init_CouchDBSyncStrategy();\n CouchDataLayerProvider = class {\n initialized = false;\n userDB;\n currentUsername = \"\";\n // the scoped list of courseIDs for a UI focused on a specific course\n // or group of courses\n _courseIDs = [];\n constructor(coursIDs) {\n if (coursIDs) {\n this._courseIDs = coursIDs;\n }\n }\n async initialize() {\n if (this.initialized) return;\n const isNodeEnvironment = typeof process !== \"undefined\" && process.versions != null && process.versions.node != null;\n if (isNodeEnvironment) {\n logger.info(\n \"CouchDataLayerProvider: Running in Node.js environment, creating guest UserDB for testing.\"\n );\n await initializeDataDirectory();\n const syncStrategy = new CouchDBSyncStrategy();\n this.userDB = await BaseUser.instance(syncStrategy);\n } else {\n const syncStrategy = new CouchDBSyncStrategy();\n this.userDB = await BaseUser.instance(syncStrategy);\n this.currentUsername = this.userDB.getUsername();\n logger.debug(`Current username: ${this.currentUsername}`);\n }\n this.initialized = true;\n }\n async teardown() {\n this.initialized = false;\n }\n getUserDB() {\n return this.userDB;\n }\n getCourseDB(courseId) {\n const localDB = CourseSyncService.getInstance().getLocalDB(courseId);\n return new CourseDB(courseId, async () => this.getUserDB(), localDB ?? void 0);\n }\n /**\n * Trigger local sync for a course. Call during app initialization or\n * pre-session loading for courses that opt in via CourseConfig.localSync.\n *\n * Safe to call multiple times — concurrent calls coalesce. Returns when\n * sync is complete (or immediately if already synced / disabled).\n *\n * @param courseId - The course to sync locally\n * @param forceEnabled - Skip CourseConfig check and sync regardless.\n * Use when the caller already knows local sync is desired.\n */\n async ensureCourseSynced(courseId, forceEnabled) {\n return CourseSyncService.getInstance().ensureSynced(courseId, forceEnabled);\n }\n getCoursesDB() {\n return new CoursesDB(this._courseIDs);\n }\n async getClassroomDB(classId, type) {\n if (type === \"student\") {\n return await StudentClassroomDB.factory(classId, this.getUserDB());\n } else {\n return await TeacherClassroomDB.factory(classId);\n }\n }\n getAdminDB() {\n return new AdminDB();\n }\n async createUserReaderForUser(targetUsername) {\n const requestingUsername = await getLoggedInUsername();\n if (requestingUsername !== \"admin\") {\n throw new Error(\"Unauthorized: Only admin users can access other users' data\");\n }\n logger.info(`Admin user '${requestingUsername}' requesting UserDBReader for '${targetUsername}'`);\n const syncStrategy = new CouchDBSyncStrategy();\n const targetUserDB = await BaseUser.instance(syncStrategy, targetUsername);\n return targetUserDB;\n }\n isReadOnly() {\n return false;\n }\n };\n }\n});\n\n// src/impl/static/StaticDataUnpacker.ts\nvar pathUtils, nodeFS, StaticDataUnpacker;\nvar init_StaticDataUnpacker = __esm({\n \"src/impl/static/StaticDataUnpacker.ts\"() {\n \"use strict\";\n init_logger();\n init_core();\n pathUtils = {\n isAbsolute: (path2) => {\n if (/^[a-zA-Z]:[\\\\/]/.test(path2) || /^\\\\\\\\/.test(path2)) {\n return true;\n }\n if (path2.startsWith(\"/\")) {\n return true;\n }\n return false;\n }\n };\n nodeFS = null;\n try {\n if (typeof window === \"undefined\" && typeof process !== \"undefined\" && process.versions?.node) {\n nodeFS = eval(\"require\")(\"fs\");\n }\n } catch {\n }\n StaticDataUnpacker = class {\n manifest;\n basePath;\n documentCache = /* @__PURE__ */ new Map();\n chunkCache = /* @__PURE__ */ new Map();\n indexCache = /* @__PURE__ */ new Map();\n constructor(manifest, basePath) {\n this.manifest = manifest;\n this.basePath = basePath;\n }\n /**\n * Get a document by ID, loading from appropriate chunk if needed\n */\n async getDocument(id) {\n if (this.documentCache.has(id)) {\n const doc = this.documentCache.get(id);\n return await this.hydrateAttachments(doc);\n }\n const chunk = await this.findChunkForDocument(id);\n if (!chunk) {\n logger.error(\n `Document ${id} not found in any chunk. Available chunks:`,\n this.manifest.chunks.map((c) => `${c.id} (${c.docType}): ${c.startKey} - ${c.endKey}`)\n );\n throw new Error(`Document ${id} not found in any chunk`);\n }\n await this.loadChunk(chunk.id);\n if (this.documentCache.has(id)) {\n const doc = this.documentCache.get(id);\n return await this.hydrateAttachments(doc);\n }\n logger.error(`Document ${id} not found in chunk ${chunk.id}`);\n throw new Error(`Document ${id} not found in chunk ${chunk.id}`);\n }\n /**\n * Get all documents with IDs starting with a specific prefix.\n *\n * This method loads the relevant chunk(s) and returns all matching documents.\n * Useful for querying documents by type (e.g., all NAVIGATION_STRATEGY documents).\n *\n * @param prefix - Document ID prefix to match (e.g., \"NAVIGATION_STRATEGY\")\n * @returns Array of all documents with IDs starting with the prefix\n */\n async getAllDocumentsByPrefix(prefix) {\n const relevantChunks = this.manifest.chunks.filter((chunk) => {\n const prefixEnd = prefix + \"\\uFFF0\";\n return chunk.startKey <= prefixEnd && chunk.endKey >= prefix;\n });\n if (relevantChunks.length === 0) {\n logger.debug(`[StaticDataUnpacker] No chunks found for prefix: ${prefix}`);\n return [];\n }\n await Promise.all(relevantChunks.map((chunk) => this.loadChunk(chunk.id)));\n const matchingDocs = [];\n for (const [docId, doc] of this.documentCache.entries()) {\n if (docId.startsWith(prefix)) {\n matchingDocs.push(await this.hydrateAttachments(doc));\n }\n }\n logger.debug(\n `[StaticDataUnpacker] Found ${matchingDocs.length} documents with prefix: ${prefix}`\n );\n return matchingDocs;\n }\n /**\n * Query cards by ELO score, returning card IDs sorted by ELO\n */\n async queryByElo(targetElo, limit = 25) {\n const eloIndex = await this.loadIndex(\"elo\");\n if (!eloIndex || !eloIndex.sorted) {\n logger.warn(\"ELO index not found or malformed, returning empty results\");\n return [];\n }\n const sorted = eloIndex.sorted;\n let startIndex = 0;\n let left = 0;\n let right = sorted.length - 1;\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n if (sorted[mid].elo < targetElo) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n startIndex = left;\n const result = [];\n const halfLimit = Math.floor(limit / 2);\n for (let i = Math.max(0, startIndex - halfLimit); i < startIndex && result.length < limit; i++) {\n result.push(sorted[i].cardId);\n }\n for (let i = startIndex; i < sorted.length && result.length < limit; i++) {\n result.push(sorted[i].cardId);\n }\n return result;\n }\n /**\n * Get all tag names mapped to their card arrays\n */\n async getTagsIndex() {\n try {\n return await this.loadIndex(\"tags\");\n } catch {\n return {\n byCard: {},\n byTag: {}\n };\n }\n }\n getDocTypeFromId(id) {\n for (const docTypeKey in DocTypePrefixes) {\n const prefix = DocTypePrefixes[docTypeKey];\n if (id.startsWith(`${prefix}-`)) {\n return docTypeKey;\n }\n }\n return void 0;\n }\n /**\n * Find which chunk contains a specific document ID\n */\n async findChunkForDocument(docId) {\n const expectedDocType = this.getDocTypeFromId(docId);\n if (expectedDocType) {\n const typeChunks = this.manifest.chunks.filter((c) => c.docType === expectedDocType);\n for (const chunk of typeChunks) {\n if (docId >= chunk.startKey && docId <= chunk.endKey) {\n const exists = await this.verifyDocumentInChunk(docId, chunk);\n if (exists) {\n return chunk;\n }\n }\n }\n } else {\n for (const chunk of this.manifest.chunks) {\n if (docId >= chunk.startKey && docId <= chunk.endKey) {\n const exists = await this.verifyDocumentInChunk(docId, chunk);\n if (exists) {\n return chunk;\n }\n }\n }\n const otherChunks = this.manifest.chunks.filter(\n (c) => c.docType !== \"CARD\" && c.docType !== \"DISPLAYABLE_DATA\" && c.docType !== \"TAG\"\n );\n for (const chunk of otherChunks) {\n if (docId >= chunk.startKey && docId <= chunk.endKey) {\n const exists = await this.verifyDocumentInChunk(docId, chunk);\n if (exists) {\n return chunk;\n }\n }\n }\n return void 0;\n }\n return void 0;\n }\n /**\n * Verify that a document actually exists in a specific chunk by loading and checking it\n */\n async verifyDocumentInChunk(docId, chunk) {\n try {\n await this.loadChunk(chunk.id);\n return this.documentCache.has(docId);\n } catch {\n return false;\n }\n }\n /**\n * Load a chunk file and cache its documents\n */\n async loadChunk(chunkId) {\n if (this.chunkCache.has(chunkId)) {\n return;\n }\n const chunk = this.manifest.chunks.find((c) => c.id === chunkId);\n if (!chunk) {\n throw new Error(`Chunk ${chunkId} not found in manifest`);\n }\n try {\n const chunkPath = `${this.basePath}/${chunk.path}`;\n logger.debug(`Loading chunk from ${chunkPath}`);\n let documents;\n if (this.isLocalPath(chunkPath) && nodeFS) {\n const fileContent = await nodeFS.promises.readFile(chunkPath, \"utf8\");\n documents = JSON.parse(fileContent);\n } else {\n const response = await fetch(chunkPath);\n if (!response.ok) {\n throw new Error(\n `Failed to fetch chunk ${chunkId}: ${response.status} ${response.statusText}`\n );\n }\n documents = await response.json();\n }\n this.chunkCache.set(chunkId, documents);\n for (const doc of documents) {\n if (doc._id) {\n this.documentCache.set(doc._id, doc);\n }\n }\n logger.debug(`Loaded ${documents.length} documents from chunk ${chunkId}`);\n } catch (error) {\n logger.error(`Failed to load chunk ${chunkId}:`, error);\n throw error;\n }\n }\n /**\n * Load an index file and cache it\n */\n async loadIndex(indexName) {\n if (this.indexCache.has(indexName)) {\n return this.indexCache.get(indexName);\n }\n const indexMeta = this.manifest.indices.find((idx) => idx.name === indexName);\n if (!indexMeta) {\n throw new Error(`Index ${indexName} not found in manifest`);\n }\n try {\n const indexPath = `${this.basePath}/${indexMeta.path}`;\n logger.debug(`Loading index from ${indexPath}`);\n let indexData;\n if (this.isLocalPath(indexPath) && nodeFS) {\n const fileContent = await nodeFS.promises.readFile(indexPath, \"utf8\");\n indexData = JSON.parse(fileContent);\n } else {\n const response = await fetch(indexPath);\n if (!response.ok) {\n throw new Error(\n `Failed to fetch index ${indexName}: ${response.status} ${response.statusText}`\n );\n }\n indexData = await response.json();\n }\n this.indexCache.set(indexName, indexData);\n logger.debug(`Loaded index ${indexName}`);\n return indexData;\n } catch (error) {\n logger.error(`Failed to load index ${indexName}:`, error);\n throw error;\n }\n }\n /**\n * Get a document by ID without hydration (raw document access)\n * Used internally to avoid recursion during attachment hydration\n */\n async getRawDocument(id) {\n if (this.documentCache.has(id)) {\n return this.documentCache.get(id);\n }\n const chunk = await this.findChunkForDocument(id);\n if (!chunk) {\n logger.error(\n `Document ${id} not found in any chunk. Available chunks:`,\n this.manifest.chunks.map((c) => `${c.id} (${c.docType}): ${c.startKey} - ${c.endKey}`)\n );\n throw new Error(`Document ${id} not found in any chunk`);\n }\n await this.loadChunk(chunk.id);\n if (this.documentCache.has(id)) {\n return this.documentCache.get(id);\n }\n logger.error(`Document ${id} not found in chunk ${chunk.id}`);\n throw new Error(`Document ${id} not found in chunk ${chunk.id}`);\n }\n /**\n * Get attachment URL for a given document and attachment name\n */\n getAttachmentUrl(docId, attachmentName) {\n return `${this.basePath}/attachments/${docId}/${attachmentName}`;\n }\n /**\n * Load attachment data from the document and get the correct file path\n * Uses raw document access to avoid recursion with hydration\n */\n async getAttachmentPath(docId, attachmentName) {\n try {\n const doc = await this.getRawDocument(docId);\n if (doc._attachments && doc._attachments[attachmentName]) {\n const attachment = doc._attachments[attachmentName];\n if (attachment.path) {\n return `${this.basePath}/${attachment.path}`;\n }\n }\n return null;\n } catch {\n return null;\n }\n }\n /**\n * Load attachment as a blob (for browser) or buffer (for Node.js)\n */\n async getAttachmentBlob(docId, attachmentName) {\n const attachmentPath = await this.getAttachmentPath(docId, attachmentName);\n if (!attachmentPath) {\n return null;\n }\n try {\n if (this.isLocalPath(attachmentPath) && nodeFS) {\n const buffer = await nodeFS.promises.readFile(attachmentPath);\n return buffer;\n } else {\n const response = await fetch(attachmentPath);\n if (!response.ok) {\n throw new Error(\n `Failed to fetch attachment ${docId}/${attachmentName}: ${response.status} ${response.statusText}`\n );\n }\n return await response.blob();\n }\n } catch (error) {\n logger.error(`Failed to load attachment ${docId}/${attachmentName}:`, error);\n return null;\n }\n }\n /**\n * Hydrate document attachments by converting file paths to blob URLs\n */\n async hydrateAttachments(doc) {\n const typedDoc = doc;\n if (!typedDoc._attachments) {\n return doc;\n }\n const hydratedDoc = JSON.parse(JSON.stringify(doc));\n for (const [attachmentName, attachment] of Object.entries(typedDoc._attachments)) {\n const attachmentData = attachment;\n if (attachmentData.path) {\n try {\n const blob = await this.getAttachmentBlob(typedDoc._id, attachmentName);\n if (blob) {\n if (typeof window !== \"undefined\" && window.URL) {\n hydratedDoc._attachments[attachmentName] = {\n ...attachmentData,\n data: blob,\n stub: false\n // Indicates this contains actual data, not just metadata\n };\n } else {\n hydratedDoc._attachments[attachmentName] = {\n ...attachmentData,\n buffer: blob\n // Attach buffer for Node.js use\n };\n }\n } else {\n logger.warn(\n `[hydrateAttachments] getAttachmentBlob returned null for ${typedDoc._id}/${attachmentName}. Skipping hydration for this attachment.`\n );\n }\n } catch (error) {\n logger.warn(\n `[hydrateAttachments] Failed to hydrate attachment ${typedDoc._id}/${attachmentName}:`,\n error\n );\n }\n } else {\n logger.debug(\n `[hydrateAttachments] Attachment ${attachmentName} for doc ${typedDoc._id} has no path. Skipping blob conversion.`\n );\n }\n }\n return hydratedDoc;\n }\n /**\n * Clear all caches (useful for testing or memory management)\n */\n clearCaches() {\n this.documentCache.clear();\n this.chunkCache.clear();\n this.indexCache.clear();\n }\n /**\n * Get cache statistics for debugging\n */\n getCacheStats() {\n return {\n documents: this.documentCache.size,\n chunks: this.chunkCache.size,\n indices: this.indexCache.size\n };\n }\n /**\n * Check if a path is a local file path (vs URL)\n */\n isLocalPath(filePath) {\n return !filePath.startsWith(\"http://\") && !filePath.startsWith(\"https://\") && (pathUtils.isAbsolute(filePath) || filePath.startsWith(\"./\") || filePath.startsWith(\"../\"));\n }\n };\n }\n});\n\n// src/impl/static/courseDB.ts\nimport { Status as Status4 } from \"@vue-skuilder/common\";\nvar StaticCourseDB;\nvar init_courseDB2 = __esm({\n \"src/impl/static/courseDB.ts\"() {\n \"use strict\";\n init_types_legacy();\n init_logger();\n init_defaults();\n init_PipelineAssembler();\n StaticCourseDB = class {\n constructor(courseId, unpacker, userDB, manifest) {\n this.courseId = courseId;\n this.unpacker = unpacker;\n this.userDB = userDB;\n this.manifest = manifest;\n }\n getCourseID() {\n return this.courseId;\n }\n async getCourseConfig() {\n if (this.manifest.courseConfig != null) {\n return this.manifest.courseConfig;\n } else {\n throw new Error(`Course config not found for course ${this.courseId}`);\n }\n }\n async updateCourseConfig(_cfg) {\n throw new Error(\"Cannot update course config in static mode\");\n }\n async getCourseInfo() {\n const cardCount = this.manifest.chunks.filter((chunk) => chunk.docType === \"CARD\" /* CARD */).reduce((total, chunk) => total + chunk.documentCount, 0);\n return {\n cardCount,\n registeredUsers: 0\n // Always 0 in static mode\n };\n }\n async getCourseDoc(id, _options) {\n return this.unpacker.getDocument(id);\n }\n async getCourseDocs(ids, _options) {\n const rows = await Promise.all(\n ids.map(async (id) => {\n try {\n const doc = await this.unpacker.getDocument(id);\n return {\n id,\n key: id,\n value: { rev: \"1-static\" },\n doc\n };\n } catch {\n return {\n key: id,\n error: \"not_found\"\n };\n }\n })\n );\n return {\n total_rows: ids.length,\n offset: 0,\n rows\n };\n }\n async getCardsByELO(elo, limit) {\n return (await this.unpacker.queryByElo(elo, limit || 25)).map((card) => {\n const [courseID, cardID, elo2] = card.split(\"-\");\n return { courseID, cardID, elo: elo2 ? parseInt(elo2) : void 0 };\n });\n }\n async getCardEloData(cardIds) {\n const results = await Promise.all(\n cardIds.map(async (id) => {\n try {\n const card = await this.unpacker.getDocument(id);\n return card.elo || { global: { score: 1e3, count: 0 }, tags: {}, misc: {} };\n } catch {\n return { global: { score: 1e3, count: 0 }, tags: {}, misc: {} };\n }\n })\n );\n return results;\n }\n async updateCardElo(cardId, _elo) {\n return { ok: true, id: cardId, rev: \"1-static\" };\n }\n async getCardsCenteredAtELO(options, filter) {\n let targetElo = typeof options.elo === \"number\" ? options.elo : 1e3;\n if (options.elo === \"user\") {\n try {\n const regDoc = await this.userDB.getCourseRegistrationsDoc();\n const courseReg = regDoc.courses.find((c) => c.courseID === this.courseId);\n if (courseReg && typeof courseReg.elo === \"object\") {\n targetElo = courseReg.elo.global.score;\n }\n } catch {\n targetElo = 1e3;\n }\n } else if (options.elo === \"random\") {\n targetElo = 800 + Math.random() * 400;\n }\n let cardIds = (await this.unpacker.queryByElo(targetElo, options.limit * 2)).map((c) => {\n return {\n cardID: c,\n courseID: this.courseId\n };\n });\n if (filter) {\n cardIds = cardIds.filter(filter);\n }\n return cardIds.slice(0, options.limit).map((card) => ({\n status: \"new\",\n // qualifiedID: `${this.courseId}-${cardId}`,\n cardID: card.cardID,\n contentSourceType: \"course\",\n contentSourceID: this.courseId,\n courseID: this.courseId\n }));\n }\n async getAppliedTags(cardId) {\n try {\n const tagsIndex = await this.unpacker.getTagsIndex();\n const cardTags = tagsIndex.byCard[cardId] || [];\n const rows = await Promise.all(\n cardTags.map(async (tagName) => {\n const tagId = `${\"TAG\" /* TAG */}-${tagName}`;\n try {\n const tagDoc = await this.unpacker.getDocument(tagId);\n return {\n id: tagId,\n key: cardId,\n value: {\n name: tagDoc.name,\n snippet: tagDoc.snippet,\n count: tagDoc.taggedCards?.length || 0\n }\n };\n } catch (error) {\n if (error && error.status === 404) {\n logger.warn(`Tag document not found for ${tagName}, creating stub`);\n } else {\n logger.error(`Error getting tag document for ${tagName}:`, error);\n throw error;\n }\n return {\n id: tagId,\n key: cardId,\n value: {\n name: tagName,\n snippet: `Tag: ${tagName}`,\n count: tagsIndex.byTag[tagName]?.length || 0\n }\n };\n }\n })\n );\n return {\n total_rows: rows.length,\n offset: 0,\n rows\n };\n } catch (error) {\n logger.error(`Error getting applied tags for card ${cardId}:`, error);\n return {\n total_rows: 0,\n offset: 0,\n rows: []\n };\n }\n }\n async getAppliedTagsBatch(cardIds) {\n const tagsIndex = await this.unpacker.getTagsIndex();\n const tagsByCard = /* @__PURE__ */ new Map();\n for (const cardId of cardIds) {\n tagsByCard.set(cardId, tagsIndex.byCard[cardId] || []);\n }\n return tagsByCard;\n }\n async getAllCardIds() {\n const tagsIndex = await this.unpacker.getTagsIndex();\n return Object.keys(tagsIndex.byCard);\n }\n async addTagToCard(_cardId, _tagId) {\n throw new Error(\"Cannot modify tags in static mode\");\n }\n async removeTagFromCard(_cardId, _tagId) {\n throw new Error(\"Cannot modify tags in static mode\");\n }\n async createTag(_tagName) {\n throw new Error(\"Cannot create tags in static mode\");\n }\n async getTag(tagName) {\n return this.unpacker.getDocument(`${\"TAG\" /* TAG */}-${tagName}`);\n }\n async updateTag(_tag) {\n throw new Error(\"Cannot update tags in static mode\");\n }\n async getCourseTagStubs() {\n try {\n const tagsIndex = await this.unpacker.getTagsIndex();\n if (!tagsIndex || !tagsIndex.byTag) {\n logger.warn(\"Tags index not found or empty\");\n return {\n total_rows: 0,\n offset: 0,\n rows: []\n };\n }\n const tagNames = Object.keys(tagsIndex.byTag);\n const rows = await Promise.all(\n tagNames.map(async (tagName) => {\n const cardIds = tagsIndex.byTag[tagName] || [];\n const tagId = `${\"TAG\" /* TAG */}-${tagName}`;\n try {\n const tagDoc = await this.unpacker.getDocument(tagId);\n return {\n id: tagId,\n key: tagId,\n value: { rev: \"1-static\" },\n doc: tagDoc\n };\n } catch (error) {\n if (error && error.status === 404) {\n logger.warn(`Tag document not found for ${tagName}, creating stub`);\n const stubDoc = {\n _id: tagId,\n _rev: \"1-static\",\n course: this.courseId,\n docType: \"TAG\" /* TAG */,\n name: tagName,\n snippet: `Tag: ${tagName}`,\n wiki: \"\",\n taggedCards: cardIds,\n author: \"system\"\n };\n return {\n id: tagId,\n key: tagId,\n value: { rev: \"1-static\" },\n doc: stubDoc\n };\n } else {\n logger.error(`Error getting tag document for ${tagName}:`, error);\n throw error;\n }\n }\n })\n );\n return {\n total_rows: rows.length,\n offset: 0,\n rows\n };\n } catch (error) {\n logger.error(\"Failed to get course tag stubs:\", error);\n return {\n total_rows: 0,\n offset: 0,\n rows: []\n };\n }\n }\n async addNote(_codeCourse, _shape, _data, _author, _tags, _uploads, _elo) {\n return {\n status: Status4.error,\n message: \"Cannot add notes in static mode\"\n };\n }\n async removeCard(_cardId) {\n throw new Error(\"Cannot remove cards in static mode\");\n }\n async getInexperiencedCards() {\n return [];\n }\n // Navigation Strategy Manager implementation\n async getNavigationStrategy(id) {\n try {\n return await this.unpacker.getDocument(id);\n } catch (error) {\n logger.error(`[static/courseDB] Strategy ${id} not found: ${error}`);\n throw error;\n }\n }\n async getAllNavigationStrategies() {\n const prefix = DocTypePrefixes[\"NAVIGATION_STRATEGY\" /* NAVIGATION_STRATEGY */];\n try {\n const docs = await this.unpacker.getAllDocumentsByPrefix(prefix);\n return docs;\n } catch (error) {\n logger.warn(`[static/courseDB] Error loading navigation strategies: ${error}`);\n return [];\n }\n }\n async addNavigationStrategy(_data) {\n throw new Error(\"Cannot add navigation strategies in static mode\");\n }\n async updateNavigationStrategy(_id, _data) {\n throw new Error(\"Cannot update navigation strategies in static mode\");\n }\n /**\n * Create a ContentNavigator for this course.\n *\n * Loads navigation strategy documents from static data and uses PipelineAssembler\n * to build a Pipeline. Falls back to default pipeline if no strategies found.\n */\n async createNavigator(user) {\n try {\n const allStrategies = await this.getAllNavigationStrategies();\n if (allStrategies.length === 0) {\n logger.debug(\n \"[static/courseDB] No strategy documents found, using default Pipeline(Composite(ELO, SRS), [eloDistanceFilter])\"\n );\n return createDefaultPipeline(user, this);\n }\n const assembler = new PipelineAssembler();\n const { pipeline, generatorStrategies, filterStrategies, warnings } = await assembler.assemble({\n strategies: allStrategies,\n user,\n course: this\n });\n for (const warning of warnings) {\n logger.warn(`[PipelineAssembler] ${warning}`);\n }\n if (!pipeline) {\n logger.debug(\"[static/courseDB] Pipeline assembly failed, using default pipeline\");\n return createDefaultPipeline(user, this);\n }\n logger.debug(\n `[static/courseDB] Using assembled pipeline with ${generatorStrategies.length} generator(s) and ${filterStrategies.length} filter(s)`\n );\n return pipeline;\n } catch (e) {\n logger.error(`[static/courseDB] Error creating navigator: ${e}`);\n throw e;\n }\n }\n // Study Content Source implementation\n _pendingHints = null;\n setEphemeralHints(hints) {\n this._pendingHints = hints;\n }\n async getWeightedCards(limit) {\n try {\n const navigator = await this.createNavigator(this.userDB);\n if (this._pendingHints) {\n navigator.setEphemeralHints(this._pendingHints);\n this._pendingHints = null;\n }\n return navigator.getWeightedCards(limit);\n } catch (e) {\n logger.error(`[static/courseDB] Error getting weighted cards: ${e}`);\n throw e;\n }\n }\n // Attachment helper methods (internal use, not part of interface)\n /**\n * Get attachment URL for a document and attachment name\n * Internal helper method for static attachment serving\n */\n getAttachmentUrl(docId, attachmentName) {\n return this.unpacker.getAttachmentUrl(docId, attachmentName);\n }\n /**\n * Load attachment as blob/buffer\n * Internal helper method for static attachment serving\n */\n async getAttachmentBlob(docId, attachmentName) {\n return this.unpacker.getAttachmentBlob(docId, attachmentName);\n }\n // Admin search methods\n async searchCards(_query) {\n return [];\n }\n async find(_request) {\n return {\n docs: [],\n warning: \"Find operations not supported in static mode\"\n };\n }\n };\n }\n});\n\n// src/impl/static/coursesDB.ts\nvar StaticCoursesDB;\nvar init_coursesDB = __esm({\n \"src/impl/static/coursesDB.ts\"() {\n \"use strict\";\n init_logger();\n StaticCoursesDB = class {\n constructor(manifests, dependencyNameToCourseId) {\n this.manifests = manifests;\n this.dependencyNameToCourseId = dependencyNameToCourseId;\n }\n async getCourseConfig(courseId) {\n let manifest = this.manifests[courseId];\n if (!manifest && this.dependencyNameToCourseId) {\n const mappedCourseId = this.dependencyNameToCourseId.get(courseId);\n if (mappedCourseId) {\n manifest = this.manifests[mappedCourseId];\n }\n }\n if (!manifest) {\n logger.warn(`Course manifest for ${courseId} not found`);\n throw new Error(`Course ${courseId} not found`);\n }\n if (manifest.courseConfig) {\n return manifest.courseConfig;\n } else {\n logger.warn(`Course config not found in manifest for course ${courseId}`);\n throw new Error(`Course config not found for course ${courseId}`);\n }\n }\n async getCourseList() {\n return Object.keys(this.manifests).map(\n (courseId) => ({\n courseID: courseId,\n name: this.manifests[courseId].courseName\n // ... other config fields\n })\n );\n }\n async disambiguateCourse(_courseId, _disambiguator) {\n logger.warn(\"Cannot disambiguate courses in static mode\");\n }\n };\n }\n});\n\n// src/impl/static/NoOpSyncStrategy.ts\nvar NoOpSyncStrategy;\nvar init_NoOpSyncStrategy = __esm({\n \"src/impl/static/NoOpSyncStrategy.ts\"() {\n \"use strict\";\n init_common();\n NoOpSyncStrategy = class {\n currentUsername = accomodateGuest().username;\n setupRemoteDB(username) {\n return getLocalUserDB(username);\n }\n getWriteDB(username) {\n return getLocalUserDB(username);\n }\n startSync(_localDB, _remoteDB) {\n }\n stopSync() {\n }\n canCreateAccount() {\n return false;\n }\n canAuthenticate() {\n return false;\n }\n async createAccount(_username, _password) {\n throw new Error(\n \"Account creation not supported in static mode. Use local account switching instead.\"\n );\n }\n async authenticate(_username, _password) {\n throw new Error(\n \"Remote authentication not supported in static mode. Use local account switching instead.\"\n );\n }\n async logout() {\n this.currentUsername = accomodateGuest().username;\n return {\n ok: true\n };\n }\n async getCurrentUsername() {\n return this.currentUsername;\n }\n /**\n * Set the current username (for local account switching)\n * This method is specific to NoOpSyncStrategy and not part of the base interface\n */\n setCurrentUsername(username) {\n this.currentUsername = username;\n }\n };\n }\n});\n\n// src/impl/static/StaticDataLayerProvider.ts\nvar StaticDataLayerProvider_exports = {};\n__export(StaticDataLayerProvider_exports, {\n StaticDataLayerProvider: () => StaticDataLayerProvider\n});\nvar StaticDataLayerProvider;\nvar init_StaticDataLayerProvider = __esm({\n \"src/impl/static/StaticDataLayerProvider.ts\"() {\n \"use strict\";\n init_logger();\n init_StaticDataUnpacker();\n init_courseDB2();\n init_coursesDB();\n init_common();\n init_NoOpSyncStrategy();\n StaticDataLayerProvider = class {\n config;\n initialized = false;\n courseUnpackers = /* @__PURE__ */ new Map();\n manifests = {};\n // Mapping from dependency name to actual courseId for backwards compatibility\n dependencyNameToCourseId = /* @__PURE__ */ new Map();\n constructor(config) {\n this.config = {\n localStoragePrefix: config.localStoragePrefix || \"skuilder-static\",\n rootManifest: config.rootManifest || { dependencies: {} },\n rootManifestUrl: config.rootManifestUrl || \"/\"\n };\n }\n async resolveCourseDependencies() {\n logger.info(\"[StaticDataLayerProvider] Starting course dependency resolution...\");\n const rootManifest = this.config.rootManifest;\n for (const [courseName, courseUrl] of Object.entries(rootManifest.dependencies || {})) {\n try {\n logger.debug(`[StaticDataLayerProvider] Resolving dependency: ${courseName} from ${courseUrl}`);\n const courseManifestUrl = new URL(courseUrl, this.config.rootManifestUrl).href;\n const courseJsonResponse = await fetch(courseManifestUrl);\n if (!courseJsonResponse.ok) {\n throw new Error(`Failed to fetch course manifest for ${courseName}`);\n }\n const courseJson = await courseJsonResponse.json();\n if (courseJson.content && courseJson.content.manifest) {\n const baseUrl = new URL(\".\", courseManifestUrl).href;\n const finalManifestUrl = new URL(courseJson.content.manifest, courseManifestUrl).href;\n const finalManifestResponse = await fetch(finalManifestUrl);\n if (!finalManifestResponse.ok) {\n throw new Error(`Failed to fetch final content manifest for ${courseName} at ${finalManifestUrl}`);\n }\n const finalManifest = await finalManifestResponse.json();\n const courseId = finalManifest.courseId || finalManifest.courseConfig?.courseID;\n if (!courseId) {\n throw new Error(`Course manifest for ${courseName} missing courseId`);\n }\n this.manifests[courseId] = finalManifest;\n const unpacker = new StaticDataUnpacker(finalManifest, baseUrl);\n this.courseUnpackers.set(courseId, unpacker);\n this.dependencyNameToCourseId.set(courseName, courseId);\n logger.info(`[StaticDataLayerProvider] Successfully resolved and prepared course: ${courseName} (courseId: ${courseId})`);\n }\n } catch (e) {\n logger.error(`[StaticDataLayerProvider] Failed to resolve dependency ${courseName}:`, e);\n }\n }\n logger.info(\"[StaticDataLayerProvider] Course dependency resolution complete.\");\n }\n async initialize() {\n if (this.initialized) return;\n logger.info(\"Initializing static data layer provider\");\n await this.resolveCourseDependencies();\n this.initialized = true;\n }\n async teardown() {\n this.courseUnpackers.clear();\n this.initialized = false;\n }\n getUserDB() {\n const syncStrategy = new NoOpSyncStrategy();\n return BaseUser.Dummy(syncStrategy);\n }\n getCourseDB(courseId) {\n let unpacker = this.courseUnpackers.get(courseId);\n let actualCourseId = courseId;\n if (!unpacker) {\n const mappedCourseId = this.dependencyNameToCourseId.get(courseId);\n if (mappedCourseId) {\n unpacker = this.courseUnpackers.get(mappedCourseId);\n actualCourseId = mappedCourseId;\n }\n }\n if (!unpacker) {\n throw new Error(`Course ${courseId} not found or failed to initialize in static data layer.`);\n }\n const manifest = this.manifests[actualCourseId];\n return new StaticCourseDB(actualCourseId, unpacker, this.getUserDB(), manifest);\n }\n getCoursesDB() {\n return new StaticCoursesDB(this.manifests, this.dependencyNameToCourseId);\n }\n async getClassroomDB(_classId, _type) {\n throw new Error(\"Classrooms not supported in static mode\");\n }\n getAdminDB() {\n throw new Error(\"Admin functions not supported in static mode\");\n }\n async createUserReaderForUser(targetUsername) {\n logger.warn(`StaticDataLayerProvider: Multi-user access not supported in static mode`);\n logger.warn(`Request: trying to access data for ${targetUsername}`);\n logger.warn(`Returning current user's data instead`);\n return this.getUserDB();\n }\n isReadOnly() {\n return true;\n }\n };\n }\n});\n\n// src/factory.ts\nasync function initializeDataLayer(config) {\n if (dataLayerInstance) {\n logger.warn(\"Data layer already initialized. Returning existing instance.\");\n return dataLayerInstance;\n }\n await initializeNavigatorRegistry();\n if (config.options.localStoragePrefix) {\n ENV.LOCAL_STORAGE_PREFIX = config.options.localStoragePrefix;\n }\n if (config.type === \"couch\") {\n if (!config.options.COUCHDB_SERVER_URL || !config.options.COUCHDB_SERVER_PROTOCOL) {\n throw new Error(\"Missing CouchDB server URL or protocol\");\n }\n ENV.COUCHDB_SERVER_PROTOCOL = config.options.COUCHDB_SERVER_PROTOCOL;\n ENV.COUCHDB_SERVER_URL = config.options.COUCHDB_SERVER_URL;\n ENV.COUCHDB_USERNAME = config.options.COUCHDB_USERNAME;\n ENV.COUCHDB_PASSWORD = config.options.COUCHDB_PASSWORD;\n if (config.options.COUCHDB_PASSWORD && config.options.COUCHDB_USERNAME && typeof window !== \"undefined\") {\n const { CouchDBSyncStrategy: CouchDBSyncStrategy2 } = await Promise.resolve().then(() => (init_CouchDBSyncStrategy(), CouchDBSyncStrategy_exports));\n const syncStrategy = new CouchDBSyncStrategy2();\n const user = await BaseUser.instance(syncStrategy, config.options.COUCHDB_USERNAME);\n const authResult = await user.login(\n config.options.COUCHDB_USERNAME,\n config.options.COUCHDB_PASSWORD\n );\n if (authResult.ok) {\n logger.info(`Successfully authenticated as ${config.options.COUCHDB_USERNAME}`);\n } else {\n logger.warn(`Authentication failed: ${authResult.error}`);\n }\n }\n const { CouchDataLayerProvider: CouchDataLayerProvider2 } = await Promise.resolve().then(() => (init_PouchDataLayerProvider(), PouchDataLayerProvider_exports));\n dataLayerInstance = new CouchDataLayerProvider2(config.options.COURSE_IDS);\n } else if (config.type === \"static\") {\n const { StaticDataLayerProvider: StaticDataLayerProvider2 } = await Promise.resolve().then(() => (init_StaticDataLayerProvider(), StaticDataLayerProvider_exports));\n dataLayerInstance = new StaticDataLayerProvider2(config.options);\n } else {\n throw new Error(`Unknown data layer type: ${config.type}`);\n }\n await dataLayerInstance.initialize();\n return dataLayerInstance;\n}\nfunction getDataLayer() {\n if (!dataLayerInstance) {\n throw new Error(\"Data layer not initialized. Call initializeDataLayer first.\");\n }\n return dataLayerInstance;\n}\nasync function _resetDataLayer() {\n if (dataLayerInstance) {\n await dataLayerInstance.teardown();\n }\n dataLayerInstance = null;\n}\nvar NOT_SET, ENV, dataLayerInstance;\nvar init_factory = __esm({\n \"src/factory.ts\"() {\n \"use strict\";\n init_common();\n init_logger();\n init_navigators();\n NOT_SET = \"NOT_SET\";\n ENV = {\n COUCHDB_SERVER_PROTOCOL: NOT_SET,\n COUCHDB_SERVER_URL: NOT_SET,\n LOCAL_STORAGE_PREFIX: \"\"\n };\n dataLayerInstance = null;\n }\n});\n\n// src/study/TagFilteredContentSource.ts\nimport { hasActiveFilter } from \"@vue-skuilder/common\";\nvar TagFilteredContentSource;\nvar init_TagFilteredContentSource = __esm({\n \"src/study/TagFilteredContentSource.ts\"() {\n \"use strict\";\n init_courseDB();\n init_logger();\n TagFilteredContentSource = class {\n courseId;\n filter;\n user;\n // Cache resolved card IDs to avoid repeated lookups within a session\n resolvedCardIds = null;\n constructor(courseId, filter, user) {\n this.courseId = courseId;\n this.filter = filter;\n this.user = user;\n logger.info(\n `[TagFilteredContentSource] Created for course \"${courseId}\" with filter:`,\n JSON.stringify(filter)\n );\n }\n /**\n * Resolves the TagFilter to a set of eligible card IDs.\n *\n * - Cards in `include` tags are OR'd together (card needs at least one)\n * - Cards in `exclude` tags are removed from the result\n */\n async resolveFilteredCardIds() {\n if (this.resolvedCardIds !== null) {\n return this.resolvedCardIds;\n }\n const includedCardIds = /* @__PURE__ */ new Set();\n if (this.filter.include.length > 0) {\n for (const tagName of this.filter.include) {\n try {\n const tagDoc = await getTag(this.courseId, tagName);\n tagDoc.taggedCards.forEach((cardId) => includedCardIds.add(cardId));\n } catch (error) {\n logger.warn(\n `[TagFilteredContentSource] Could not resolve tag \"${tagName}\" for inclusion:`,\n error\n );\n }\n }\n }\n if (includedCardIds.size === 0 && this.filter.include.length > 0) {\n logger.warn(\n `[TagFilteredContentSource] No cards found for include tags: ${this.filter.include.join(\", \")}`\n );\n this.resolvedCardIds = /* @__PURE__ */ new Set();\n return this.resolvedCardIds;\n }\n const excludedCardIds = /* @__PURE__ */ new Set();\n if (this.filter.exclude.length > 0) {\n for (const tagName of this.filter.exclude) {\n try {\n const tagDoc = await getTag(this.courseId, tagName);\n tagDoc.taggedCards.forEach((cardId) => excludedCardIds.add(cardId));\n } catch (error) {\n logger.warn(\n `[TagFilteredContentSource] Could not resolve tag \"${tagName}\" for exclusion:`,\n error\n );\n }\n }\n }\n const finalCardIds = /* @__PURE__ */ new Set();\n for (const cardId of includedCardIds) {\n if (!excludedCardIds.has(cardId)) {\n finalCardIds.add(cardId);\n }\n }\n logger.info(\n `[TagFilteredContentSource] Resolved ${finalCardIds.size} cards (included: ${includedCardIds.size}, excluded: ${excludedCardIds.size})`\n );\n this.resolvedCardIds = finalCardIds;\n return finalCardIds;\n }\n /**\n * Get cards with suitability scores for presentation.\n *\n * Filters cards by tag inclusion/exclusion and assigns score=1.0 to all.\n * TagFilteredContentSource does not currently support pluggable navigation\n * strategies - it returns flat-scored candidates.\n *\n * @param limit - Maximum number of cards to return\n * @returns Cards sorted by score descending (all scores = 1.0)\n */\n async getWeightedCards(limit) {\n if (!hasActiveFilter(this.filter)) {\n logger.warn(\"[TagFilteredContentSource] getWeightedCards called with no active filter\");\n return { cards: [] };\n }\n const eligibleCardIds = await this.resolveFilteredCardIds();\n const activeCards = await this.user.getActiveCards();\n const activeCardIds = new Set(activeCards.map((c) => c.cardID));\n const newCardWeighted = [];\n for (const cardId of eligibleCardIds) {\n if (!activeCardIds.has(cardId)) {\n newCardWeighted.push({\n cardId,\n courseId: this.courseId,\n score: 1,\n provenance: [\n {\n strategy: \"tagFilter\",\n strategyName: \"Tag Filter\",\n strategyId: \"TAG_FILTER\",\n action: \"generated\",\n score: 1,\n reason: `Tag-filtered new card (tags: ${this.filter.include.join(\", \")})`\n }\n ]\n });\n }\n if (newCardWeighted.length >= limit) {\n break;\n }\n }\n logger.info(\n `[TagFilteredContentSource] Found ${newCardWeighted.length} new cards matching filter`\n );\n const allReviews = await this.user.getPendingReviews(this.courseId);\n const filteredReviews = allReviews.filter((review) => eligibleCardIds.has(review.cardId));\n logger.info(\n `[TagFilteredContentSource] Found ${filteredReviews.length} pending reviews matching filter (of ${allReviews.length} total)`\n );\n const reviewWeighted = filteredReviews.map((r) => ({\n cardId: r.cardId,\n courseId: r.courseId,\n score: 1,\n reviewID: r._id,\n provenance: [\n {\n strategy: \"tagFilter\",\n strategyName: \"Tag Filter\",\n strategyId: \"TAG_FILTER\",\n action: \"generated\",\n score: 1,\n reason: `Tag-filtered review (tags: ${this.filter.include.join(\", \")})`\n }\n ]\n }));\n return { cards: [...reviewWeighted, ...newCardWeighted].slice(0, limit) };\n }\n /**\n * Clears the cached resolved card IDs.\n * Call this if the underlying tag data may have changed during a session.\n */\n clearCache() {\n this.resolvedCardIds = null;\n }\n /**\n * Returns the course ID this source is filtering.\n */\n getCourseId() {\n return this.courseId;\n }\n /**\n * Returns the active tag filter.\n */\n getFilter() {\n return this.filter;\n }\n };\n }\n});\n\n// src/core/interfaces/contentSource.ts\nimport { hasActiveFilter as hasActiveFilter2 } from \"@vue-skuilder/common\";\nfunction isReview(item) {\n const ret = item.status === \"review\" || item.status === \"failed-review\" || \"reviewID\" in item;\n return ret;\n}\nasync function getStudySource(source, user) {\n if (source.type === \"classroom\") {\n return await StudentClassroomDB.factory(source.id, user);\n } else {\n if (hasActiveFilter2(source.tagFilter)) {\n return new TagFilteredContentSource(source.id, source.tagFilter, user);\n }\n return getDataLayer().getCourseDB(source.id);\n }\n}\nvar init_contentSource = __esm({\n \"src/core/interfaces/contentSource.ts\"() {\n \"use strict\";\n init_factory();\n init_classroomDB2();\n init_TagFilteredContentSource();\n }\n});\n\n// src/core/interfaces/courseDB.ts\nvar init_courseDB3 = __esm({\n \"src/core/interfaces/courseDB.ts\"() {\n \"use strict\";\n }\n});\n\n// src/core/interfaces/dataLayerProvider.ts\nvar init_dataLayerProvider = __esm({\n \"src/core/interfaces/dataLayerProvider.ts\"() {\n \"use strict\";\n }\n});\n\n// src/core/interfaces/userDB.ts\nvar init_userDB = __esm({\n \"src/core/interfaces/userDB.ts\"() {\n \"use strict\";\n }\n});\n\n// src/core/interfaces/index.ts\nvar init_interfaces = __esm({\n \"src/core/interfaces/index.ts\"() {\n \"use strict\";\n init_adminDB();\n init_classroomDB();\n init_contentSource();\n init_courseDB3();\n init_dataLayerProvider();\n init_userDB();\n }\n});\n\n// src/core/types/user.ts\nvar init_user = __esm({\n \"src/core/types/user.ts\"() {\n \"use strict\";\n }\n});\n\n// src/core/types/strategyState.ts\nfunction buildStrategyStateId(courseId, strategyKey) {\n return `STRATEGY_STATE::${courseId}::${strategyKey}`;\n}\nvar init_strategyState = __esm({\n \"src/core/types/strategyState.ts\"() {\n \"use strict\";\n }\n});\n\n// src/core/types/userOutcome.ts\nvar init_userOutcome = __esm({\n \"src/core/types/userOutcome.ts\"() {\n \"use strict\";\n }\n});\n\n// src/core/bulkImport/cardProcessor.ts\nimport { Status as Status5 } from \"@vue-skuilder/common\";\nasync function importParsedCards(parsedCards, courseDB, config) {\n const results = [];\n for (const parsedCard of parsedCards) {\n try {\n const result = await processCard(parsedCard, courseDB, config);\n results.push(result);\n } catch (error) {\n logger.error(\"Error processing card:\", error);\n let errorOriginalText = parsedCard.markdown;\n if (parsedCard.tags && parsedCard.tags.length > 0) {\n errorOriginalText += `\ntags: ${parsedCard.tags.join(\", \")}`;\n }\n if (parsedCard.elo !== void 0) {\n errorOriginalText += `\nelo: ${parsedCard.elo}`;\n }\n results.push({\n originalText: errorOriginalText,\n status: \"error\",\n message: `Error processing card: ${error instanceof Error ? error.message : \"Unknown error\"}`\n });\n }\n }\n return results;\n}\nasync function processCard(parsedCard, courseDB, config) {\n const { markdown, tags, elo } = parsedCard;\n let originalText = markdown;\n if (tags.length > 0) {\n originalText += `\ntags: ${tags.join(\", \")}`;\n }\n if (elo !== void 0) {\n originalText += `\nelo: ${elo}`;\n }\n const cardData = {\n Input: markdown,\n Uploads: []\n // No uploads for bulk import\n };\n const tagsElo = {};\n for (const tag of tags) {\n tagsElo[tag] = {\n score: elo || 0,\n count: 1\n };\n }\n try {\n const result = await courseDB.addNote(\n config.courseCode,\n config.dataShape,\n cardData,\n config.userName,\n tags,\n void 0,\n // attachments\n elo ? {\n global: {\n score: elo,\n count: 1\n },\n tags: tagsElo,\n misc: {}\n } : void 0\n );\n if (result.status === Status5.ok) {\n return {\n originalText,\n status: \"success\",\n message: \"Card added successfully.\",\n cardId: result.id ? result.id : \"(unknown)\"\n };\n } else {\n return {\n originalText,\n status: \"error\",\n message: result.message || \"Failed to add card to database. Unknown error.\"\n };\n }\n } catch (error) {\n logger.error(\"Error adding note:\", error);\n return {\n originalText,\n status: \"error\",\n message: `Error adding card: ${error instanceof Error ? error.message : \"Unknown error\"}`\n };\n }\n}\nfunction validateProcessorConfig(config) {\n if (!config.dataShape) {\n return {\n isValid: false,\n errorMessage: \"No data shape provided for card processing\"\n };\n }\n if (!config.courseCode) {\n return {\n isValid: false,\n errorMessage: \"No course code provided for card processing\"\n };\n }\n if (!config.userName) {\n return {\n isValid: false,\n errorMessage: \"No user name provided for card processing\"\n };\n }\n return { isValid: true };\n}\nvar init_cardProcessor = __esm({\n \"src/core/bulkImport/cardProcessor.ts\"() {\n \"use strict\";\n init_logger();\n }\n});\n\n// src/core/bulkImport/types.ts\nvar init_types3 = __esm({\n \"src/core/bulkImport/types.ts\"() {\n \"use strict\";\n }\n});\n\n// src/core/bulkImport/index.ts\nvar init_bulkImport = __esm({\n \"src/core/bulkImport/index.ts\"() {\n \"use strict\";\n init_cardProcessor();\n init_types3();\n }\n});\n\n// src/core/UserDBDebugger.ts\nfunction getUserDB() {\n try {\n const provider = getDataLayer();\n return provider.getUserDB();\n } catch {\n logger.info(\"[UserDB Debug] Data layer not initialized yet.\");\n return null;\n }\n}\nfunction getRawDB() {\n const userDB = getUserDB();\n if (!userDB) return null;\n const rawDB = userDB.localDB;\n if (!rawDB) {\n logger.info(\"[UserDB Debug] Unable to access raw database instance.\");\n return null;\n }\n return rawDB;\n}\nfunction formatTimestamp(isoString) {\n const date = new Date(isoString);\n return date.toLocaleString();\n}\nfunction mountUserDBDebugger() {\n if (typeof window === \"undefined\") return;\n const win = window;\n win.skuilder = win.skuilder || {};\n win.skuilder.userdb = userDBDebugAPI;\n}\nvar userDBDebugAPI;\nvar init_UserDBDebugger = __esm({\n \"src/core/UserDBDebugger.ts\"() {\n \"use strict\";\n init_logger();\n init_factory();\n init_types_legacy();\n init_userDBHelpers();\n userDBDebugAPI = {\n /**\n * Show current user information\n */\n showUser() {\n const userDB = getUserDB();\n if (!userDB) return;\n console.group(\"\\u{1F464} User Information\");\n logger.info(`Username: ${userDB.getUsername()}`);\n logger.info(`Logged in: ${userDB.isLoggedIn() ? \"Yes \\u2705\" : \"No (Guest) \\u274C\"}`);\n userDB.getConfig().then((config) => {\n logger.info(\"Configuration:\");\n logger.info(JSON.stringify(config, null, 2));\n }).catch((err) => {\n logger.info(`Error loading config: ${err.message}`);\n }).finally(() => {\n console.groupEnd();\n });\n },\n /**\n * Show scheduled reviews\n */\n async showScheduledReviews(courseId) {\n const userDB = getUserDB();\n if (!userDB) return;\n try {\n const reviews = await userDB.getPendingReviews(courseId);\n console.group(`\\u{1F4C5} Scheduled Reviews${courseId ? ` (${courseId})` : \"\"}`);\n logger.info(`Total: ${reviews.length}`);\n if (reviews.length > 0) {\n const byCourse = /* @__PURE__ */ new Map();\n for (const review of reviews) {\n if (!byCourse.has(review.courseId)) {\n byCourse.set(review.courseId, []);\n }\n byCourse.get(review.courseId).push(review);\n }\n for (const [course, courseReviews] of byCourse) {\n console.group(`Course: ${course} (${courseReviews.length} reviews)`);\n const sorted = courseReviews.sort((a, b) => {\n const timeA = typeof a.reviewTime === \"string\" ? a.reviewTime : a.reviewTime.toISOString();\n const timeB = typeof b.reviewTime === \"string\" ? b.reviewTime : b.reviewTime.toISOString();\n return new Date(timeA).getTime() - new Date(timeB).getTime();\n });\n for (const review of sorted.slice(0, 10)) {\n const reviewTimeStr = typeof review.reviewTime === \"string\" ? review.reviewTime : review.reviewTime.toISOString();\n logger.info(\n ` ${review.cardId.slice(0, 12)}... @ ${formatTimestamp(reviewTimeStr)} [${review.scheduledFor}/${review.schedulingAgentId}]`\n );\n }\n if (sorted.length > 10) {\n logger.info(` ... and ${sorted.length - 10} more`);\n }\n console.groupEnd();\n }\n }\n console.groupEnd();\n } catch (err) {\n logger.info(`Error loading scheduled reviews: ${err.message}`);\n }\n },\n /**\n * Show course registrations\n */\n async showCourseRegistrations() {\n const userDB = getUserDB();\n if (!userDB) return;\n try {\n const registrations = await userDB.getActiveCourses();\n console.group(\"\\u{1F4DA} Course Registrations\");\n logger.info(`Total: ${registrations.length}`);\n if (registrations.length > 0) {\n console.table(\n registrations.map((reg) => ({\n courseId: reg.courseID,\n status: reg.status || \"active\",\n elo: typeof reg.elo === \"number\" ? reg.elo.toFixed(0) : reg.elo?.global?.score?.toFixed(0) || \"N/A\"\n }))\n );\n }\n console.groupEnd();\n } catch (err) {\n logger.info(`Error loading course registrations: ${err.message}`);\n }\n },\n /**\n * Show card history for a specific card\n */\n async showCardHistory(cardId) {\n const rawDB = getRawDB();\n if (!rawDB) return;\n try {\n const result = await filterAllDocsByPrefix(rawDB, DocTypePrefixes[\"CARDRECORD\" /* CARDRECORD */]);\n const cardHistories = result.rows.filter((row) => row.doc && row.doc.cardID === cardId).map((row) => row.doc);\n console.group(`\\u{1F3B4} Card History: ${cardId}`);\n logger.info(`Total interactions: ${cardHistories.length}`);\n if (cardHistories.length > 0) {\n const sorted = cardHistories.sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\n );\n console.table(\n sorted.slice(0, 20).map((doc) => ({\n time: formatTimestamp(doc.timestamp),\n outcome: doc.outcome || \"N/A\",\n duration: doc.duration ? `${(doc.duration / 1e3).toFixed(1)}s` : \"N/A\",\n courseId: doc.courseId\n }))\n );\n if (sorted.length > 20) {\n logger.info(`... and ${sorted.length - 20} more interactions`);\n }\n }\n console.groupEnd();\n } catch (err) {\n logger.info(`Error loading card history: ${err.message}`);\n }\n },\n /**\n * Query documents by type\n */\n async queryByType(docType, limit = 50) {\n const rawDB = getRawDB();\n if (!rawDB) return;\n try {\n const prefix = DocTypePrefixes[DocType[docType]];\n if (!prefix) {\n logger.info(`Unknown document type: ${docType}`);\n return;\n }\n const result = await filterAllDocsByPrefix(rawDB, prefix);\n console.group(`\\u{1F4C4} Documents: ${docType}`);\n logger.info(`Total: ${result.rows.length}`);\n logger.info(`Prefix: ${prefix}`);\n if (result.rows.length > 0) {\n logger.info(\"Sample documents:\");\n const samples = result.rows.slice(0, Math.min(limit, result.rows.length));\n for (const row of samples) {\n logger.info(`\n${row.id}:`);\n logger.info(JSON.stringify(row.doc, null, 2));\n }\n if (result.rows.length > limit) {\n logger.info(`\n... and ${result.rows.length - limit} more documents`);\n }\n }\n console.groupEnd();\n } catch (err) {\n logger.info(`Error querying documents: ${err.message}`);\n }\n },\n /**\n * Show database info and statistics\n */\n async dbInfo() {\n const rawDB = getRawDB();\n if (!rawDB) return;\n try {\n const info = await rawDB.info();\n console.group(\"\\u2139\\uFE0F Database Information\");\n logger.info(`Database name: ${info.db_name}`);\n logger.info(`Total documents: ${info.doc_count}`);\n logger.info(`Update sequence: ${info.update_seq}`);\n if (\"disk_size\" in info) {\n logger.info(`Disk size: ${(info.disk_size || 0) / 1024 / 1024} MB`);\n }\n logger.info(\"\\nDocument counts by type:\");\n const allDocs = await rawDB.allDocs({ include_docs: false });\n const typeCounts = /* @__PURE__ */ new Map();\n for (const row of allDocs.rows) {\n let prefix = \"other\";\n for (const [type, typePrefix] of Object.entries(DocTypePrefixes)) {\n if (row.id.startsWith(typePrefix)) {\n prefix = type;\n break;\n }\n }\n typeCounts.set(prefix, (typeCounts.get(prefix) || 0) + 1);\n }\n console.table(\n Array.from(typeCounts.entries()).sort((a, b) => b[1] - a[1]).map(([type, count]) => ({ type, count }))\n );\n console.groupEnd();\n } catch (err) {\n logger.info(`Error getting database info: ${err.message}`);\n }\n },\n /**\n * List all document types\n */\n listDocTypes() {\n console.group(\"\\u{1F4CB} Available Document Types\");\n logger.info(\"Use with queryByType(type):\");\n for (const [type, prefix] of Object.entries(DocTypePrefixes)) {\n logger.info(` ${type.padEnd(30)} \\u2192 prefix: \"${prefix}\"`);\n }\n console.groupEnd();\n },\n /**\n * Export database contents (limited, for debugging)\n */\n async export(includeContent = false) {\n const rawDB = getRawDB();\n const userDB = getUserDB();\n if (!rawDB || !userDB) return \"{}\";\n try {\n const data = {\n username: userDB.getUsername(),\n loggedIn: userDB.isLoggedIn(),\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n };\n if (includeContent) {\n const allDocs = await rawDB.allDocs({ include_docs: true });\n data.documents = allDocs.rows.map((row) => ({\n id: row.id,\n doc: row.doc\n }));\n data.totalDocs = allDocs.rows.length;\n } else {\n const allDocs = await rawDB.allDocs({ include_docs: false });\n data.totalDocs = allDocs.rows.length;\n const typeCounts = /* @__PURE__ */ new Map();\n for (const row of allDocs.rows) {\n let prefix = \"other\";\n for (const [type, typePrefix] of Object.entries(DocTypePrefixes)) {\n if (row.id.startsWith(typePrefix)) {\n prefix = type;\n break;\n }\n }\n typeCounts.set(prefix, (typeCounts.get(prefix) || 0) + 1);\n }\n data.docCounts = Object.fromEntries(typeCounts);\n }\n const json = JSON.stringify(data, null, 2);\n logger.info(\"[UserDB Debug] Database info exported. Copy the returned string or use:\");\n logger.info(\" copy(window.skuilder.userdb.export())\");\n if (!includeContent) {\n logger.info(\" For full content export: window.skuilder.userdb.export(true)\");\n }\n return json;\n } catch (err) {\n logger.info(`Error exporting database: ${err.message}`);\n return \"{}\";\n }\n },\n /**\n * Execute raw PouchDB query\n */\n async raw(queryFn) {\n const rawDB = getRawDB();\n if (!rawDB) return;\n try {\n const result = await queryFn(rawDB);\n logger.info(\"[UserDB Debug] Query result:\");\n logger.info(result);\n } catch (err) {\n logger.info(`[UserDB Debug] Query error: ${err.message}`);\n }\n },\n /**\n * Show help\n */\n help() {\n logger.info(`\n\\u{1F527} UserDB Debug API\n\nCommands:\n .showUser() Show current user info and config\n .showScheduledReviews(courseId?) Show scheduled reviews (optionally filter by course)\n .showCourseRegistrations() Show all course registrations\n .showCardHistory(cardId) Show interaction history for a card\n .queryByType(docType, limit?) Query documents by type (e.g., 'SCHEDULED_CARD')\n .listDocTypes() List all available document types\n .dbInfo() Show database info and statistics\n .export(includeContent?) Export database info (true = include all docs)\n .raw(queryFn) Execute raw PouchDB query\n .help() Show this help message\n\nExamples:\n window.skuilder.userdb.showUser()\n window.skuilder.userdb.showScheduledReviews('course123')\n window.skuilder.userdb.queryByType('SCHEDULED_CARD', 10)\n window.skuilder.userdb.raw(db => db.allDocs({ limit: 5 }))\n`);\n }\n };\n mountUserDBDebugger();\n }\n});\n\n// src/core/index.ts\nvar init_core = __esm({\n \"src/core/index.ts\"() {\n \"use strict\";\n init_interfaces();\n init_types_legacy();\n init_user();\n init_strategyState();\n init_userOutcome();\n init_Loggable();\n init_util();\n init_navigators();\n init_bulkImport();\n init_orchestration();\n init_UserDBDebugger();\n }\n});\n\n// src/index.ts\ninit_core();\ninit_courseLookupDB();\n\n// src/courseConfigRegistration.ts\ninit_logger();\nimport { NameSpacer as NameSpacer2, toZodJSON } from \"@vue-skuilder/common\";\nfunction isDataShapeRegistered(dataShape, courseConfig) {\n const namespacedName = NameSpacer2.getDataShapeString({\n dataShape: dataShape.name,\n course: dataShape.course\n });\n const existingDataShape = courseConfig.dataShapes.find((ds) => ds.name === namespacedName);\n return existingDataShape !== void 0;\n}\nfunction isDataShapeSchemaAvailable(dataShape, courseConfig) {\n const namespacedName = NameSpacer2.getDataShapeString({\n dataShape: dataShape.name,\n course: dataShape.course\n });\n const existingDataShape = courseConfig.dataShapes.find((ds) => ds.name === namespacedName);\n return existingDataShape !== void 0 && existingDataShape.serializedZodSchema !== void 0;\n}\nfunction isQuestionTypeRegistered(question, courseConfig) {\n const namespacedName = NameSpacer2.getQuestionString({\n course: question.course,\n questionType: question.name\n });\n return courseConfig.questionTypes.some((qt) => qt.name === namespacedName);\n}\nfunction processCustomQuestionsData(customQuestions) {\n const processedDataShapes = [];\n const processedQuestions = [];\n const courseNames = customQuestions.courses.map((course) => course.name);\n customQuestions.questionClasses.forEach((questionClass) => {\n const courseName = courseNames.length > 0 ? courseNames[0] : customQuestions.meta.packageName;\n if (questionClass.dataShapes && Array.isArray(questionClass.dataShapes)) {\n questionClass.dataShapes.forEach((dataShape) => {\n processedDataShapes.push({\n name: dataShape.name,\n course: courseName,\n dataShape\n });\n });\n }\n processedQuestions.push({\n name: questionClass.name,\n course: courseName,\n questionClass,\n dataShapes: questionClass.dataShapes || [],\n views: questionClass.views || []\n });\n });\n return { dataShapes: processedDataShapes, questions: processedQuestions };\n}\nfunction registerDataShape(dataShape, courseConfig) {\n const namespacedName = NameSpacer2.getDataShapeString({\n dataShape: dataShape.name,\n course: dataShape.course\n });\n let serializedZodSchema;\n try {\n serializedZodSchema = toZodJSON(dataShape.dataShape);\n } catch (error) {\n logger.warn(`Failed to generate schema for ${namespacedName}:`, error);\n serializedZodSchema = void 0;\n }\n const existingIndex = courseConfig.dataShapes.findIndex((ds) => ds.name === namespacedName);\n if (existingIndex !== -1) {\n const existingDataShape = courseConfig.dataShapes[existingIndex];\n if (existingDataShape.serializedZodSchema === serializedZodSchema) {\n logger.info(\n `DataShape '${dataShape.name}' from '${dataShape.course}' already registered with identical schema`\n );\n return false;\n }\n if (existingDataShape.serializedZodSchema) {\n logger.info(\n `DataShape '${dataShape.name}' from '${dataShape.course}' schema has changed, updating...`\n );\n } else {\n logger.info(\n `DataShape '${dataShape.name}' from '${dataShape.course}' already registered, but with no schema. Adding schema to existing entry`\n );\n }\n courseConfig.dataShapes[existingIndex] = {\n name: namespacedName,\n questionTypes: existingDataShape.questionTypes,\n // Preserve existing question type associations\n serializedZodSchema\n };\n logger.info(`Updated DataShape: ${namespacedName}`);\n return true;\n }\n courseConfig.dataShapes.push({\n name: namespacedName,\n questionTypes: [],\n serializedZodSchema\n });\n logger.info(`Registered DataShape: ${namespacedName}`);\n return true;\n}\nfunction registerQuestionType(question, courseConfig) {\n if (isQuestionTypeRegistered(question, courseConfig)) {\n logger.info(`QuestionType '${question.name}' from '${question.course}' already registered`);\n return false;\n }\n const namespacedQuestionName = NameSpacer2.getQuestionString({\n course: question.course,\n questionType: question.name\n });\n const viewList = question.views.map((view) => {\n if (view.name) {\n return view.name;\n } else {\n return \"unnamedComponent\";\n }\n });\n const dataShapeList = question.dataShapes.map(\n (dataShape) => NameSpacer2.getDataShapeString({\n course: question.course,\n dataShape: dataShape.name\n })\n );\n courseConfig.questionTypes.push({\n name: namespacedQuestionName,\n viewList,\n dataShapeList\n });\n question.dataShapes.forEach((dataShape) => {\n const namespacedDataShapeName = NameSpacer2.getDataShapeString({\n course: question.course,\n dataShape: dataShape.name\n });\n for (const ds of courseConfig.dataShapes) {\n if (ds.name === namespacedDataShapeName) {\n ds.questionTypes.push(namespacedQuestionName);\n }\n }\n });\n logger.info(`Registered QuestionType: ${namespacedQuestionName}`);\n return true;\n}\nfunction removeDataShape(dataShapeName, courseConfig) {\n const index = courseConfig.dataShapes.findIndex((ds) => ds.name === dataShapeName);\n if (index === -1) {\n logger.info(`DataShape '${dataShapeName}' not found in course config`);\n return false;\n }\n courseConfig.dataShapes.splice(index, 1);\n courseConfig.questionTypes.forEach((qt) => {\n const dsIndex = qt.dataShapeList.indexOf(dataShapeName);\n if (dsIndex !== -1) {\n qt.dataShapeList.splice(dsIndex, 1);\n }\n });\n logger.info(`Removed DataShape: ${dataShapeName}`);\n return true;\n}\nfunction removeQuestionType(questionTypeName, courseConfig) {\n const index = courseConfig.questionTypes.findIndex((qt) => qt.name === questionTypeName);\n if (index === -1) {\n logger.info(`QuestionType '${questionTypeName}' not found in course config`);\n return false;\n }\n courseConfig.questionTypes.splice(index, 1);\n courseConfig.dataShapes.forEach((ds) => {\n const qtIndex = ds.questionTypes.indexOf(questionTypeName);\n if (qtIndex !== -1) {\n ds.questionTypes.splice(qtIndex, 1);\n }\n });\n logger.info(`Removed QuestionType: ${questionTypeName}`);\n return true;\n}\nasync function removeCustomQuestionTypes(dataShapeNames, questionTypeNames, courseConfig, courseDB) {\n try {\n logger.info(\"Beginning custom question removal\");\n logger.info(`Removing ${dataShapeNames.length} data shapes and ${questionTypeNames.length} question types`);\n let removedCount = 0;\n for (const qtName of questionTypeNames) {\n if (removeQuestionType(qtName, courseConfig)) {\n removedCount++;\n }\n }\n for (const dsName of dataShapeNames) {\n if (removeDataShape(dsName, courseConfig)) {\n removedCount++;\n }\n }\n logger.info(\"Updating course configuration...\");\n const updateResult = await courseDB.updateCourseConfig(courseConfig);\n if (!updateResult.ok) {\n throw new Error(`Failed to update course config: ${JSON.stringify(updateResult)}`);\n }\n logger.info(`Custom question removal complete: ${removedCount} items removed`);\n return { success: true, removedCount };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Custom question removal failed: ${errorMessage}`);\n return { success: false, removedCount: 0, errorMessage };\n }\n}\nasync function registerSeedData(question, courseDB, username) {\n if (question.questionClass.seedData && Array.isArray(question.questionClass.seedData)) {\n logger.info(`Registering seed data for question: ${question.name}`);\n try {\n const seedDataPromises = question.questionClass.seedData.filter(() => question.dataShapes.length > 0).map(\n (seedDataItem) => courseDB.addNote(\n question.course,\n question.dataShapes[0],\n seedDataItem,\n username,\n []\n )\n );\n await Promise.all(seedDataPromises);\n logger.info(`Seed data registered for question: ${question.name}`);\n } catch (error) {\n logger.warn(\n `Failed to register seed data for question '${question.name}': ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n}\nasync function registerBlanksCard(BlanksCard, BlanksCardDataShapes, courseConfig, courseDB, username) {\n try {\n logger.info(\"Registering BlanksCard data shapes and question type...\");\n let registeredCount = 0;\n const courseName = \"default\";\n for (const dataShapeClass of BlanksCardDataShapes) {\n const processedDataShape = {\n name: dataShapeClass.name,\n course: courseName,\n dataShape: dataShapeClass\n };\n if (registerDataShape(processedDataShape, courseConfig)) {\n registeredCount++;\n }\n }\n const processedQuestion = {\n name: BlanksCard.name,\n course: courseName,\n questionClass: {\n name: BlanksCard.name,\n dataShapes: BlanksCardDataShapes,\n views: BlanksCard.views || []\n },\n dataShapes: BlanksCardDataShapes,\n views: BlanksCard.views || []\n };\n if (registerQuestionType(processedQuestion, courseConfig)) {\n registeredCount++;\n }\n logger.info(\"Updating course configuration with BlanksCard...\");\n const updateResult = await courseDB.updateCourseConfig(courseConfig);\n if (!updateResult.ok) {\n throw new Error(`Failed to update course config: ${JSON.stringify(updateResult)}`);\n }\n if (username) {\n await registerSeedData(processedQuestion, courseDB, username);\n }\n logger.info(`BlanksCard registration complete: ${registeredCount} items registered`);\n return { success: true };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`BlanksCard registration failed: ${errorMessage}`);\n return { success: false, errorMessage };\n }\n}\nasync function registerCustomQuestionTypes(customQuestions, courseConfig, courseDB, username) {\n try {\n logger.info(\"Beginning custom question registration\");\n logger.info(`Processing ${customQuestions.questionClasses.length} question classes`);\n const { dataShapes, questions } = processCustomQuestionsData(customQuestions);\n logger.info(`Found ${dataShapes.length} data shapes and ${questions.length} questions`);\n let registeredCount = 0;\n logger.info(\"Registering data shapes...\");\n for (const dataShape of dataShapes) {\n if (registerDataShape(dataShape, courseConfig)) {\n registeredCount++;\n }\n }\n logger.info(\"Registering question types...\");\n for (const question of questions) {\n if (registerQuestionType(question, courseConfig)) {\n registeredCount++;\n }\n }\n logger.info(\"Updating course configuration...\");\n const updateResult = await courseDB.updateCourseConfig(courseConfig);\n if (!updateResult.ok) {\n throw new Error(`Failed to update course config: ${JSON.stringify(updateResult)}`);\n }\n if (username) {\n logger.info(\"Registering seed data...\");\n for (const question of questions) {\n await registerSeedData(question, courseDB, username);\n }\n }\n logger.info(`Custom question registration complete: ${registeredCount} items registered`);\n return { success: true, registeredCount };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Custom question registration failed: ${errorMessage}`);\n return { success: false, registeredCount: 0, errorMessage };\n }\n}\n\n// src/study/services/SrsService.ts\ninit_couch();\nimport moment8 from \"moment\";\n\n// src/study/SpacedRepetition.ts\ninit_util();\ninit_logger();\nimport moment7 from \"moment\";\nimport { isTaggedPerformance } from \"@vue-skuilder/common\";\nvar duration = moment7.duration;\nfunction newInterval(user, cardHistory) {\n if (areQuestionRecords(cardHistory)) {\n return newQuestionInterval(user, cardHistory);\n } else {\n return 1e5;\n }\n}\nfunction newQuestionInterval(user, cardHistory) {\n const records = cardHistory.records;\n const currentAttempt = records[records.length - 1];\n const lastInterval = lastSuccessfulInterval(records);\n if (lastInterval > cardHistory.bestInterval) {\n cardHistory.bestInterval = lastInterval;\n user.update(cardHistory._id, {\n bestInterval: lastInterval\n }).catch((e) => {\n logger.warn(`[SpacedRepetition] Failed to update bestInterval for ${cardHistory._id}: ${e?.message ?? e}`);\n });\n }\n if (currentAttempt.isCorrect) {\n const rawPerf = currentAttempt.performance;\n const numericPerf = isTaggedPerformance(rawPerf) ? rawPerf._global : rawPerf;\n const skill = Math.min(1, Math.max(0, numericPerf));\n logger.debug(`Demontrated skill: \t${skill}`);\n const interval = lastInterval * (0.75 + skill);\n cardHistory.lapses = getLapses(cardHistory.records);\n cardHistory.streak = getStreak(cardHistory.records);\n if (cardHistory.lapses && cardHistory.streak && cardHistory.bestInterval && (cardHistory.lapses >= 0 || cardHistory.streak >= 0)) {\n const ret = (cardHistory.lapses * interval + cardHistory.streak * cardHistory.bestInterval) / (cardHistory.lapses + cardHistory.streak);\n logger.debug(`Weighted average interval calculation:\n\t(${cardHistory.lapses} * ${interval} + ${cardHistory.streak} * ${cardHistory.bestInterval}) / (${cardHistory.lapses} + ${cardHistory.streak}) = ${ret}`);\n return ret;\n } else {\n return interval;\n }\n } else {\n return 0;\n }\n}\nfunction lastSuccessfulInterval(cardHistory) {\n for (let i = cardHistory.length - 1; i >= 1; i--) {\n if (cardHistory[i].priorAttemps === 0 && cardHistory[i].isCorrect) {\n const lastInterval = secondsBetween(cardHistory[i - 1].timeStamp, cardHistory[i].timeStamp);\n const ret = Math.max(lastInterval, 20 * 60 * 60);\n logger.debug(`Last interval w/ this card was: ${lastInterval}s, returning ${ret}s`);\n return ret;\n }\n }\n return getInitialInterval(cardHistory);\n}\nfunction getStreak(records) {\n let streak = 0;\n let index = records.length - 1;\n while (index >= 0 && records[index].isCorrect) {\n index--;\n streak++;\n }\n return streak;\n}\nfunction getLapses(records) {\n return records.filter((r) => r.isCorrect === false).length;\n}\nfunction getInitialInterval(cardHistory) {\n logger.warn(`history of length: ${cardHistory.length} ignored!`);\n return 60 * 60 * 24 * 3;\n}\nfunction secondsBetween(start, end) {\n start = moment7(start);\n end = moment7(end);\n const ret = duration(end.diff(start)).asSeconds();\n return ret;\n}\n\n// src/study/services/SrsService.ts\ninit_logger();\nvar SrsService = class {\n user;\n constructor(user) {\n this.user = user;\n }\n /**\n * Remove a scheduled review from the user's database.\n * Used to clean up orphaned reviews (e.g., card deleted from course DB).\n */\n removeReview(reviewID) {\n logger.info(`[SrsService] Removing orphaned scheduled review: ${reviewID}`);\n void this.user.removeScheduledCardReview(reviewID);\n }\n /**\n * Calculates the next review time for a card based on its history and\n * schedules it in the user's database.\n * @param history The full history of the card.\n * @param item The study session item, used to determine if a previous review needs to be cleared.\n */\n async scheduleReview(history, item) {\n const nextInterval = newInterval(this.user, history);\n const nextReviewTime = moment8.utc().add(nextInterval, \"seconds\");\n if (isReview(item)) {\n logger.info(`[SrsService] Removing previously scheduled review for: ${item.cardID}`);\n void this.user.removeScheduledCardReview(item.reviewID);\n }\n void this.user.scheduleCardReview({\n user: this.user.getUsername(),\n course_id: history.courseID,\n card_id: history.cardID,\n time: nextReviewTime,\n scheduledFor: item.contentSourceType,\n schedulingAgentId: item.contentSourceID\n });\n }\n};\n\n// src/study/services/EloService.ts\ninit_logger();\nimport {\n adjustCourseScores,\n adjustCourseScoresPerTag,\n toCourseElo as toCourseElo7\n} from \"@vue-skuilder/common\";\nvar EloService = class {\n dataLayer;\n user;\n constructor(dataLayer, user) {\n this.dataLayer = dataLayer;\n this.user = user;\n }\n /**\n * Updates both user and card ELO ratings based on user performance.\n * @param userScore Score between 0-1 representing user performance\n * @param course_id Course identifier\n * @param card_id Card identifier\n * @param userCourseRegDoc User's course registration document (will be mutated)\n * @param currentCard Current card session record\n * @param k Optional K-factor for ELO calculation\n */\n async updateUserAndCardElo(userScore, course_id, card_id, userCourseRegDoc, currentCard, k) {\n if (k) {\n logger.warn(`k value interpretation not currently implemented`);\n }\n const courseDB = this.dataLayer.getCourseDB(currentCard.card.course_id);\n const userElo = toCourseElo7(\n userCourseRegDoc.courses.find((c) => c.courseID === course_id).elo\n );\n const cardElo = (await courseDB.getCardEloData([currentCard.card.card_id]))[0];\n if (cardElo && userElo) {\n const eloUpdate = adjustCourseScores(userElo, cardElo, userScore);\n userCourseRegDoc.courses.find((c) => c.courseID === course_id).elo = eloUpdate.userElo;\n const results = await Promise.allSettled([\n this.user.updateUserElo(course_id, eloUpdate.userElo),\n courseDB.updateCardElo(card_id, eloUpdate.cardElo)\n ]);\n const userEloStatus = results[0].status === \"fulfilled\";\n const cardEloStatus = results[1].status === \"fulfilled\";\n if (userEloStatus && cardEloStatus) {\n const user = results[0].value;\n const card = results[1].value;\n if (user.ok && card && card.ok) {\n logger.info(\n `[EloService] Updated ELOS:\n \tUser: ${JSON.stringify(eloUpdate.userElo)})\n \tCard: ${JSON.stringify(eloUpdate.cardElo)})\n `\n );\n }\n } else {\n logger.warn(\n `[EloService] Partial ELO update:\n \tUser ELO update: ${userEloStatus ? \"SUCCESS\" : \"FAILED\"}\n \tCard ELO update: ${cardEloStatus ? \"SUCCESS\" : \"FAILED\"}`\n );\n if (!userEloStatus && results[0].status === \"rejected\") {\n logger.error(\"[EloService] User ELO update error:\", results[0].reason);\n }\n if (!cardEloStatus && results[1].status === \"rejected\") {\n logger.error(\"[EloService] Card ELO update error:\", results[1].reason);\n }\n }\n }\n }\n /**\n * Updates both user and card ELO ratings with per-tag granularity.\n * Tags in taggedPerformance but not on card will be created dynamically.\n *\n * @param taggedPerformance Performance object with _global and per-tag scores\n * @param course_id Course identifier\n * @param card_id Card identifier\n * @param userCourseRegDoc User's course registration document (will be mutated)\n * @param currentCard Current card session record\n */\n async updateUserAndCardEloPerTag(taggedPerformance, course_id, card_id, userCourseRegDoc, currentCard) {\n const courseDB = this.dataLayer.getCourseDB(currentCard.card.course_id);\n const userElo = toCourseElo7(\n userCourseRegDoc.courses.find((c) => c.courseID === course_id).elo\n );\n const [cardEloResults, cardTagsMap] = await Promise.all([\n courseDB.getCardEloData([currentCard.card.card_id]),\n courseDB.getAppliedTagsBatch([card_id])\n ]);\n const cardElo = cardEloResults[0];\n const cardTags = cardTagsMap.get(card_id) ?? [];\n const enriched = { ...taggedPerformance };\n const globalScore = taggedPerformance._global;\n for (const tag of cardTags) {\n if (!(tag in enriched)) {\n enriched[tag] = globalScore;\n }\n }\n if (cardElo && userElo) {\n const eloUpdate = adjustCourseScoresPerTag(userElo, cardElo, enriched);\n userCourseRegDoc.courses.find((c) => c.courseID === course_id).elo = eloUpdate.userElo;\n const results = await Promise.allSettled([\n this.user.updateUserElo(course_id, eloUpdate.userElo),\n courseDB.updateCardElo(card_id, eloUpdate.cardElo)\n ]);\n const userEloStatus = results[0].status === \"fulfilled\";\n const cardEloStatus = results[1].status === \"fulfilled\";\n if (userEloStatus && cardEloStatus) {\n const user = results[0].value;\n const card = results[1].value;\n if (user.ok && card && card.ok) {\n const tagCount = Object.keys(enriched).length - 1;\n logger.info(\n `[EloService] Updated ELOS (per-tag, ${tagCount} tags):\n \tUser: ${JSON.stringify(eloUpdate.userElo)})\n \tCard: ${JSON.stringify(eloUpdate.cardElo)})\n `\n );\n }\n } else {\n logger.warn(\n `[EloService] Partial ELO update (per-tag):\n \tUser ELO update: ${userEloStatus ? \"SUCCESS\" : \"FAILED\"}\n \tCard ELO update: ${cardEloStatus ? \"SUCCESS\" : \"FAILED\"}`\n );\n if (!userEloStatus && results[0].status === \"rejected\") {\n logger.error(\"[EloService] User ELO update error:\", results[0].reason);\n }\n if (!cardEloStatus && results[1].status === \"rejected\") {\n logger.error(\"[EloService] Card ELO update error:\", results[1].reason);\n }\n }\n }\n }\n};\n\n// src/study/services/ResponseProcessor.ts\ninit_core();\ninit_logger();\nimport { isTaggedPerformance as isTaggedPerformance2 } from \"@vue-skuilder/common\";\nvar ResponseProcessor = class {\n srsService;\n eloService;\n constructor(srsService, eloService) {\n this.srsService = srsService;\n this.eloService = eloService;\n }\n /**\n * Parses performance data into global score and optional per-tag scores.\n *\n * @param performance - Numeric or structured performance from QuestionRecord\n * @returns Parsed performance with global score and optional tag scores\n */\n parsePerformance(performance2) {\n if (typeof performance2 === \"number\") {\n return {\n globalScore: performance2,\n taggedPerformance: null\n };\n }\n if (isTaggedPerformance2(performance2)) {\n return {\n globalScore: performance2._global,\n taggedPerformance: performance2\n };\n }\n logger.warn(\"[ResponseProcessor] Unexpected performance structure, using neutral score\", {\n performance: performance2\n });\n return {\n globalScore: 0.5,\n taggedPerformance: null\n };\n }\n /**\n * Processes a user's response to a card, handling SRS scheduling and ELO updates.\n * @param cardRecord User's response record\n * @param cardHistory Promise resolving to the card's history\n * @param studySessionItem Current study session item\n * @param courseRegistrationDoc User's course registration (for ELO updates)\n * @param currentCard Current study session record\n * @param courseId Course identifier\n * @param cardId Card identifier\n * @param maxAttemptsPerView Maximum attempts allowed per view\n * @param maxSessionViews Maximum session views for this card\n * @param sessionViews Current number of session views\n * @returns ResponseResult with navigation and UI instructions\n */\n async processResponse(cardRecord, cardHistory, studySessionItem, courseRegistrationDoc, currentCard, courseId, cardId, maxAttemptsPerView, maxSessionViews, sessionViews) {\n if (!isQuestionRecord(cardRecord)) {\n return {\n nextCardAction: \"dismiss-success\",\n shouldLoadNextCard: true,\n isCorrect: true,\n // non-question records are considered \"correct\"\n shouldClearFeedbackShadow: true\n };\n }\n try {\n const history = await cardHistory;\n let result;\n if (cardRecord.isCorrect) {\n result = this.processCorrectResponse(\n cardRecord,\n history,\n studySessionItem,\n courseRegistrationDoc,\n currentCard,\n courseId,\n cardId\n );\n } else {\n result = this.processIncorrectResponse(\n cardRecord,\n history,\n courseRegistrationDoc,\n currentCard,\n courseId,\n cardId,\n maxAttemptsPerView,\n maxSessionViews,\n sessionViews\n );\n }\n if (cardRecord.deferAdvance && result.shouldLoadNextCard) {\n logger.info(\n \"[ResponseProcessor] deferAdvance requested \\u2014 suppressing navigation, action stashed:\",\n { nextCardAction: result.nextCardAction }\n );\n result = {\n ...result,\n shouldLoadNextCard: false,\n deferred: true\n };\n }\n return result;\n } catch (e) {\n logger.error(\"[ResponseProcessor] Failed to load card history\", { e, cardId });\n throw e;\n }\n }\n /**\n * Handles processing for correct responses: SRS scheduling and ELO updates.\n */\n processCorrectResponse(cardRecord, history, studySessionItem, courseRegistrationDoc, currentCard, courseId, cardId) {\n if (cardRecord.priorAttemps === 0) {\n const skipSrs = currentCard.card.tags.includes(\"srs:skip\");\n if (!skipSrs) {\n void this.srsService.scheduleReview(history, studySessionItem);\n }\n const { globalScore, taggedPerformance } = this.parsePerformance(cardRecord.performance);\n if (taggedPerformance) {\n const tagKeys = Object.keys(taggedPerformance).filter((k) => k !== \"_global\");\n const nullTags = tagKeys.filter((k) => taggedPerformance[k] === null);\n const scoredTags = tagKeys.filter((k) => taggedPerformance[k] !== null);\n logger.info(\n `[ResponseProcessor] per-tag ELO update for ${cardId}: scored=[${scoredTags.join(\", \")}] count-only=[${nullTags.join(\", \")}]`\n );\n void this.eloService.updateUserAndCardEloPerTag(\n taggedPerformance,\n courseId,\n cardId,\n courseRegistrationDoc,\n currentCard\n );\n } else {\n const userScore = 0.5 + globalScore / 2;\n if (history.records.length === 1) {\n void this.eloService.updateUserAndCardElo(\n userScore,\n courseId,\n cardId,\n courseRegistrationDoc,\n currentCard\n );\n } else {\n const k = Math.ceil(32 / history.records.length);\n void this.eloService.updateUserAndCardElo(\n userScore,\n courseId,\n cardId,\n courseRegistrationDoc,\n currentCard,\n k\n );\n }\n logger.info(\n \"[ResponseProcessor] Processed correct response with SRS scheduling and ELO update\"\n );\n }\n return {\n nextCardAction: \"dismiss-success\",\n shouldLoadNextCard: true,\n isCorrect: true,\n performanceScore: globalScore,\n shouldClearFeedbackShadow: true\n };\n } else {\n logger.info(\n \"[ResponseProcessor] Processed correct response (retry attempt - no scheduling/ELO)\"\n );\n const { globalScore } = this.parsePerformance(cardRecord.performance);\n return {\n nextCardAction: \"marked-failed\",\n shouldLoadNextCard: true,\n isCorrect: true,\n performanceScore: globalScore,\n shouldClearFeedbackShadow: true\n };\n }\n }\n /**\n * Handles processing for incorrect responses: ELO updates only.\n */\n processIncorrectResponse(cardRecord, history, courseRegistrationDoc, currentCard, courseId, cardId, maxAttemptsPerView, maxSessionViews, sessionViews) {\n const { taggedPerformance } = this.parsePerformance(cardRecord.performance);\n if (history.records.length !== 1 && cardRecord.priorAttemps === 0) {\n if (taggedPerformance) {\n void this.eloService.updateUserAndCardEloPerTag(\n taggedPerformance,\n courseId,\n cardId,\n courseRegistrationDoc,\n currentCard\n );\n logger.info(\n `[ResponseProcessor] Processed incorrect response with per-tag ELO update (${Object.keys(taggedPerformance).length - 1} tags)`\n );\n } else {\n void this.eloService.updateUserAndCardElo(\n 0,\n // Failed response = 0 score\n courseId,\n cardId,\n courseRegistrationDoc,\n currentCard\n );\n logger.info(\"[ResponseProcessor] Processed incorrect response with ELO update\");\n }\n } else {\n logger.info(\"[ResponseProcessor] Processed incorrect response (no ELO update needed)\");\n }\n if (currentCard.records.length >= maxAttemptsPerView) {\n if (sessionViews >= maxSessionViews) {\n if (taggedPerformance) {\n void this.eloService.updateUserAndCardEloPerTag(\n taggedPerformance,\n courseId,\n cardId,\n courseRegistrationDoc,\n currentCard\n );\n } else {\n void this.eloService.updateUserAndCardElo(\n 0,\n courseId,\n cardId,\n courseRegistrationDoc,\n currentCard\n );\n }\n return {\n nextCardAction: \"dismiss-failed\",\n shouldLoadNextCard: true,\n isCorrect: false,\n shouldClearFeedbackShadow: true\n };\n } else {\n return {\n nextCardAction: \"marked-failed\",\n shouldLoadNextCard: true,\n isCorrect: false,\n shouldClearFeedbackShadow: true\n };\n }\n } else {\n return {\n nextCardAction: \"none\",\n shouldLoadNextCard: false,\n isCorrect: false,\n shouldClearFeedbackShadow: true\n };\n }\n }\n};\n\n// src/study/services/CardHydrationService.ts\ninit_logger();\nimport {\n displayableDataToViewData,\n isCourseElo,\n toCourseElo as toCourseElo8\n} from \"@vue-skuilder/common\";\nfunction parseAudioURIs(data) {\n if (typeof data !== \"string\") return [];\n const audioPattern = /https?:\\/\\/[^\\s\"'<>]+\\.(wav|mp3|ogg|m4a|aac|webm)/gi;\n return data.match(audioPattern) ?? [];\n}\nfunction prefetchAudio(url) {\n return new Promise((resolve) => {\n const audio = new Audio();\n audio.preload = \"auto\";\n const cleanup = () => {\n audio.oncanplaythrough = null;\n audio.onerror = null;\n };\n audio.oncanplaythrough = () => {\n cleanup();\n resolve();\n };\n audio.onerror = () => {\n cleanup();\n logger.warn(`[CardHydrationService] Failed to prefetch audio: ${url}`);\n resolve();\n };\n audio.src = url;\n });\n}\nvar CardHydrationService = class {\n constructor(getViewComponent, getCourseDB3, getItemsToHydrate) {\n this.getViewComponent = getViewComponent;\n this.getCourseDB = getCourseDB3;\n this.getItemsToHydrate = getItemsToHydrate;\n }\n hydratedCards = /* @__PURE__ */ new Map();\n hydrationInFlight = /* @__PURE__ */ new Set();\n hydrationInProgress = false;\n /**\n * Get a hydrated card by ID.\n * @returns Hydrated card or null if not in cache\n */\n getHydratedCard(cardId) {\n return this.hydratedCards.get(cardId) ?? null;\n }\n /**\n * Check if a card is hydrated.\n */\n hasHydratedCard(cardId) {\n return this.hydratedCards.has(cardId);\n }\n /**\n * Remove a card from the cache (call on successful dismiss to free memory).\n */\n removeCard(cardId) {\n this.hydratedCards.delete(cardId);\n }\n /**\n * Check if hydration should be triggered and start background hydration if needed.\n */\n async ensureHydratedCards() {\n void this.fillHydratedCards();\n }\n /**\n * Wait for a specific card to become hydrated.\n * @returns Promise that resolves to a hydrated card or null\n */\n async waitForCard(cardId) {\n if (this.hydratedCards.has(cardId)) {\n return this.hydratedCards.get(cardId);\n }\n if (!this.hydrationInProgress) {\n void this.fillHydratedCards();\n }\n const maxWaitMs = 1e4;\n const pollIntervalMs = 25;\n let elapsed = 0;\n while (elapsed < maxWaitMs) {\n if (this.hydratedCards.has(cardId)) {\n return this.hydratedCards.get(cardId);\n }\n if (!this.hydrationInFlight.has(cardId) && !this.hydrationInProgress) {\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));\n elapsed += pollIntervalMs;\n }\n return this.hydratedCards.get(cardId) ?? null;\n }\n /**\n * Get current hydrated cache size.\n */\n get hydratedCount() {\n return this.hydratedCards.size;\n }\n /**\n * Get list of currently hydrated card IDs (for debugging).\n */\n getHydratedCardIds() {\n return Array.from(this.hydratedCards.keys());\n }\n /**\n * Fill the hydrated cache by hydrating items from getItemsToHydrate().\n * This is a pure cache-warming operation - no queue mutation.\n */\n async fillHydratedCards() {\n if (this.hydrationInProgress) {\n return;\n }\n this.hydrationInProgress = true;\n try {\n const itemsToHydrate = this.getItemsToHydrate();\n for (const item of itemsToHydrate) {\n if (this.hydratedCards.has(item.cardID) || this.hydrationInFlight.has(item.cardID)) {\n continue;\n }\n try {\n await this.hydrateCard(item);\n } catch (e) {\n logger.error(`[CardHydrationService] Error hydrating card ${item.cardID}:`, e);\n }\n }\n } finally {\n this.hydrationInProgress = false;\n }\n }\n /**\n * Hydrate a single card and add to cache.\n */\n async hydrateCard(item) {\n if (this.hydratedCards.has(item.cardID) || this.hydrationInFlight.has(item.cardID)) {\n return;\n }\n this.hydrationInFlight.add(item.cardID);\n try {\n const courseDB = this.getCourseDB(item.courseID);\n const [cardData, tagsByCard] = await Promise.all([\n courseDB.getCourseDoc(item.cardID),\n courseDB.getAppliedTagsBatch([item.cardID])\n ]);\n if (!isCourseElo(cardData.elo)) {\n cardData.elo = toCourseElo8(cardData.elo);\n }\n const view = this.getViewComponent(cardData.id_view);\n const dataDocs = await Promise.all(\n cardData.id_displayable_data.map(\n (id) => courseDB.getCourseDoc(id, {\n attachments: true,\n binary: true\n })\n )\n );\n const audioToPrefetch = [];\n dataDocs.forEach((dd) => {\n dd.data.forEach((f) => {\n audioToPrefetch.push(...parseAudioURIs(f.data));\n });\n });\n const uniqueAudioUrls = [...new Set(audioToPrefetch)];\n if (uniqueAudioUrls.length > 0) {\n logger.debug(\n `[CardHydrationService] Prefetching ${uniqueAudioUrls.length} audio files for card ${item.cardID}`\n );\n await Promise.allSettled(uniqueAudioUrls.map(prefetchAudio));\n }\n const data = dataDocs.map(displayableDataToViewData).reverse();\n this.hydratedCards.set(item.cardID, {\n item,\n view,\n data,\n tags: tagsByCard.get(item.cardID) ?? []\n });\n logger.debug(`[CardHydrationService] Hydrated card ${item.cardID}`);\n } finally {\n this.hydrationInFlight.delete(item.cardID);\n }\n }\n};\n\n// src/study/ItemQueue.ts\nvar ItemQueue = class {\n q = [];\n seenCardIds = [];\n _dequeueCount = 0;\n get dequeueCount() {\n return this._dequeueCount;\n }\n add(item, cardId) {\n if (this.seenCardIds.find((d) => d === cardId)) {\n return;\n }\n this.seenCardIds.push(cardId);\n this.q.push(item);\n }\n addAll(items, cardIdExtractor) {\n items.forEach((i) => this.add(i, cardIdExtractor(i)));\n }\n get length() {\n return this.q.length;\n }\n peek(index) {\n return this.q[index];\n }\n dequeue(cardIdExtractor) {\n if (this.q.length !== 0) {\n this._dequeueCount++;\n const item = this.q.splice(0, 1)[0];\n if (cardIdExtractor) {\n const cardId = cardIdExtractor(item);\n const index = this.seenCardIds.indexOf(cardId);\n if (index > -1) {\n this.seenCardIds.splice(index, 1);\n }\n }\n return item;\n } else {\n return null;\n }\n }\n /**\n * Atomically replace all queue contents with new items.\n *\n * Used by mid-session replanning to swap the queue without a window where\n * it's empty (avoiding dead-air if nextCard() is called concurrently).\n *\n * Preserves dequeueCount (cumulative across the session).\n * Resets seenCardIds to match the new contents — cards from the old queue\n * that don't appear in the new set can be re-added in future replans.\n */\n replaceAll(items, cardIdExtractor) {\n this.q = [];\n this.seenCardIds = [];\n for (const item of items) {\n const cardId = cardIdExtractor(item);\n if (!this.seenCardIds.includes(cardId)) {\n this.seenCardIds.push(cardId);\n this.q.push(item);\n }\n }\n }\n /**\n * Merge new items into the front of the queue, skipping duplicates.\n * Used by additive replans to inject high-quality candidates without\n * discarding the existing queue contents.\n */\n mergeToFront(items, cardIdExtractor) {\n let added = 0;\n const toInsert = [];\n for (const item of items) {\n const cardId = cardIdExtractor(item);\n if (!this.seenCardIds.includes(cardId)) {\n this.seenCardIds.push(cardId);\n toInsert.push(item);\n added++;\n }\n }\n this.q.unshift(...toInsert);\n return added;\n }\n get toString() {\n return `${typeof this.q[0]}:\n` + this.q.map((i) => `\t${i.courseID}+${i.cardID}: ${i.status}`).join(\"\\n\");\n }\n};\n\n// src/study/SessionController.ts\ninit_couch();\ninit_recording();\n\n// src/util/index.ts\ninit_Loggable();\n\n// src/util/packer/CouchDBToStaticPacker.ts\ninit_types_legacy();\ninit_logger();\nvar CouchDBToStaticPacker = class {\n config;\n sourceDB = null;\n constructor(config = {}) {\n this.config = {\n chunkSize: 1e3,\n includeAttachments: true,\n ...config\n };\n }\n /**\n * Pack a CouchDB course database into static data structures\n */\n async packCourse(sourceDB, courseId) {\n logger.info(`Starting static pack for course: ${courseId}`);\n this.sourceDB = sourceDB;\n const manifest = {\n version: \"1.0.0\",\n courseId,\n courseName: \"\",\n courseConfig: null,\n lastUpdated: (/* @__PURE__ */ new Date()).toISOString(),\n documentCount: 0,\n chunks: [],\n indices: [],\n designDocs: []\n };\n const courseConfig = await this.extractCourseConfig(sourceDB);\n manifest.courseName = courseConfig.name;\n manifest.courseConfig = courseConfig;\n manifest.designDocs = await this.extractDesignDocs(sourceDB);\n const docsByType = await this.extractDocumentsByType(sourceDB);\n const attachments = /* @__PURE__ */ new Map();\n if (this.config.includeAttachments) {\n await this.extractAllAttachments(docsByType, attachments);\n }\n const chunks = /* @__PURE__ */ new Map();\n for (const [docType, docs] of Object.entries(docsByType)) {\n const chunkMetadata = this.createChunks(docs, docType);\n manifest.chunks.push(...chunkMetadata);\n manifest.documentCount += docs.length;\n this.prepareChunkData(chunkMetadata, docs, chunks);\n }\n const indices = /* @__PURE__ */ new Map();\n manifest.indices = await this.buildIndices(docsByType, manifest.designDocs, indices);\n return {\n manifest,\n chunks,\n indices,\n attachments\n };\n }\n /**\n * Pack a CouchDB course database and write the static files to disk\n */\n async packCourseToFiles(sourceDB, courseId, outputDir, fsAdapter) {\n logger.info(`Packing course ${courseId} to files in ${outputDir}`);\n const packedData = await this.packCourse(sourceDB, courseId);\n const filesWritten = await this.writePackedDataToFiles(packedData, outputDir, fsAdapter);\n return {\n manifest: packedData.manifest,\n filesWritten,\n attachmentsFound: packedData.attachments ? packedData.attachments.size : 0\n };\n }\n /**\n * Write packed course data to files using FileSystemAdapter\n */\n async writePackedDataToFiles(packedData, outputDir, fsAdapter) {\n let totalFiles = 0;\n await fsAdapter.ensureDir(outputDir);\n const manifestPath = fsAdapter.joinPath(outputDir, \"manifest.json\");\n await fsAdapter.writeJson(manifestPath, packedData.manifest, { spaces: 2 });\n totalFiles++;\n logger.info(`Wrote manifest: ${manifestPath}`);\n const chunksDir = fsAdapter.joinPath(outputDir, \"chunks\");\n const indicesDir = fsAdapter.joinPath(outputDir, \"indices\");\n await fsAdapter.ensureDir(chunksDir);\n await fsAdapter.ensureDir(indicesDir);\n for (const [chunkId, chunkData] of packedData.chunks) {\n const chunkPath = fsAdapter.joinPath(chunksDir, `${chunkId}.json`);\n await fsAdapter.writeJson(chunkPath, chunkData);\n totalFiles++;\n }\n logger.info(`Wrote ${packedData.chunks.size} chunk files`);\n for (const [indexName, indexData] of packedData.indices) {\n const indexPath = fsAdapter.joinPath(indicesDir, `${indexName}.json`);\n await fsAdapter.writeJson(indexPath, indexData, { spaces: 2 });\n totalFiles++;\n }\n logger.info(`Wrote ${packedData.indices.size} index files`);\n if (packedData.attachments && packedData.attachments.size > 0) {\n for (const [attachmentPath, attachmentData] of packedData.attachments) {\n const fullAttachmentPath = fsAdapter.joinPath(outputDir, attachmentPath);\n const attachmentDir = fsAdapter.dirname(fullAttachmentPath);\n await fsAdapter.ensureDir(attachmentDir);\n await fsAdapter.writeFile(fullAttachmentPath, attachmentData.buffer);\n totalFiles++;\n }\n logger.info(`Wrote ${packedData.attachments.size} attachment files`);\n }\n return totalFiles;\n }\n async extractCourseConfig(db) {\n try {\n return await db.get(\"CourseConfig\");\n } catch (error) {\n logger.error(\"Failed to extract course config:\", error);\n throw new Error(\"Course config not found\");\n }\n }\n async extractDesignDocs(db) {\n const result = await db.allDocs({\n startkey: \"_design/\",\n endkey: \"_design/\\uFFF0\",\n include_docs: true\n });\n return result.rows.map((row) => ({\n _id: row.id,\n views: row.doc.views || {}\n }));\n }\n async extractDocumentsByType(db) {\n const allDocs = await db.allDocs({ include_docs: true });\n const docsByType = {};\n for (const row of allDocs.rows) {\n if (row.id.startsWith(\"_\")) continue;\n const doc = row.doc;\n if (doc.docType) {\n if (!docsByType[doc.docType]) {\n docsByType[doc.docType] = [];\n }\n docsByType[doc.docType].push(doc);\n }\n }\n return docsByType;\n }\n createChunks(docs, docType) {\n const chunks = [];\n const sortedDocs = docs.sort((a, b) => a._id.localeCompare(b._id));\n for (let i = 0; i < sortedDocs.length; i += this.config.chunkSize) {\n const chunk = sortedDocs.slice(i, i + this.config.chunkSize);\n const chunkId = `${docType}-${String(Math.floor(i / this.config.chunkSize)).padStart(4, \"0\")}`;\n chunks.push({\n id: chunkId,\n docType,\n startKey: chunk[0]._id,\n endKey: chunk[chunk.length - 1]._id,\n documentCount: chunk.length,\n path: `chunks/${chunkId}.json`\n });\n }\n return chunks;\n }\n prepareChunkData(chunkMetadata, docs, chunks) {\n const sortedDocs = docs.sort((a, b) => a._id.localeCompare(b._id));\n for (const chunk of chunkMetadata) {\n const chunkDocs = sortedDocs.filter(\n (doc) => doc._id >= chunk.startKey && doc._id <= chunk.endKey\n );\n const cleanedDocs = chunkDocs.map((doc) => {\n const cleaned = { ...doc };\n delete cleaned._rev;\n if (this.config.includeAttachments && cleaned._attachments) {\n cleaned._attachments = this.transformAttachmentStubs(cleaned._attachments, cleaned._id);\n } else if (!this.config.includeAttachments) {\n delete cleaned._attachments;\n }\n return cleaned;\n });\n chunks.set(chunk.id, cleanedDocs);\n }\n }\n async buildIndices(docsByType, designDocs, indices) {\n const indexMetadata = [];\n if (docsByType[\"CARD\" /* CARD */]) {\n const eloIndexMeta = await this.buildEloIndex(\n docsByType[\"CARD\" /* CARD */],\n indices\n );\n indexMetadata.push(eloIndexMeta);\n }\n if (docsByType[\"TAG\" /* TAG */]) {\n const tagIndexMeta = await this.buildTagIndex(docsByType[\"TAG\" /* TAG */], indices);\n indexMetadata.push(tagIndexMeta);\n }\n for (const designDoc of designDocs) {\n for (const [viewName, viewDef] of Object.entries(designDoc.views)) {\n if (viewDef.map) {\n logger.info(`Processing view: ${designDoc._id}/${viewName}`);\n const indexMeta = await this.buildViewIndex(viewName, designDoc, indices);\n if (indexMeta) {\n indexMetadata.push(indexMeta);\n logger.info(`Successfully built index: ${indexMeta.name}`);\n } else {\n logger.warn(`Skipped view index: ${designDoc._id}/${viewName}`);\n }\n }\n }\n }\n return indexMetadata;\n }\n async buildEloIndex(cards, indices) {\n const eloIndex = [];\n for (const card of cards) {\n if (card.elo?.global?.score) {\n eloIndex.push({\n elo: card.elo.global.score,\n cardId: card._id\n });\n }\n }\n eloIndex.sort((a, b) => a.elo - b.elo);\n const buckets = {};\n const bucketSize = 50;\n for (const entry of eloIndex) {\n const bucket = Math.floor(entry.elo / bucketSize) * bucketSize;\n if (!buckets[bucket]) buckets[bucket] = [];\n buckets[bucket].push(entry.cardId);\n }\n indices.set(\"elo\", {\n sorted: eloIndex,\n buckets,\n stats: {\n min: eloIndex[0]?.elo || 0,\n max: eloIndex[eloIndex.length - 1]?.elo || 0,\n count: eloIndex.length\n }\n });\n return {\n name: \"elo\",\n type: \"btree\",\n path: \"indices/elo.json\"\n };\n }\n async buildTagIndex(tags, indices) {\n const tagIndex = {};\n for (const tag of tags) {\n tagIndex[tag.name] = {\n cardIds: tag.taggedCards,\n snippet: tag.snippet,\n count: tag.taggedCards.length\n };\n }\n const cardToTags = {};\n for (const tag of tags) {\n for (const cardId of tag.taggedCards) {\n if (!cardToTags[cardId]) cardToTags[cardId] = [];\n cardToTags[cardId].push(tag.name);\n }\n }\n indices.set(\"tags\", {\n byTag: tagIndex,\n byCard: cardToTags\n });\n return {\n name: \"tags\",\n type: \"hash\",\n path: \"indices/tags.json\"\n };\n }\n /**\n * Build view index by querying CouchDB views directly instead of parsing map functions\n */\n async buildViewIndex(viewName, designDoc, indices) {\n if (!this.sourceDB) {\n logger.error(\"Source database not available for view querying\");\n return null;\n }\n try {\n const designDocId = designDoc._id;\n const designDocName = designDocId.replace(\"_design/\", \"\");\n const viewPath = `${designDocName}/${viewName}`;\n logger.info(`Querying CouchDB view: ${viewPath}`);\n const viewResults = await this.sourceDB.query(viewPath, {\n include_docs: false\n });\n if (!viewResults.rows || viewResults.rows.length === 0) {\n logger.warn(`View ${viewPath} returned no results`);\n return null;\n }\n logger.info(`Successfully queried view ${viewPath}: ${viewResults.rows.length} results`);\n const formattedResults = this.formatViewResults(viewName, viewResults.rows, designDoc);\n const indexName = `view-${designDoc._id.replace(\"_design/\", \"\")}-${viewName}`;\n indices.set(indexName, formattedResults);\n return {\n name: indexName,\n type: \"view\",\n path: `indices/${indexName}.json`\n };\n } catch (error) {\n logger.error(`Failed to query view ${designDoc._id}/${viewName}:`, error);\n return null;\n }\n }\n /**\n * Format CouchDB view results for static consumption\n */\n formatViewResults(viewName, viewRows, designDoc) {\n const baseResult = {\n type: \"couchdb-view\",\n viewName,\n designDoc: designDoc._id,\n results: viewRows,\n metadata: {\n resultCount: viewRows.length,\n generatedAt: (/* @__PURE__ */ new Date()).toISOString()\n }\n };\n switch (viewName) {\n case \"elo\":\n return this.formatEloViewIndex(viewRows, baseResult);\n case \"getTags\":\n return this.formatTagsViewIndex(viewRows, baseResult);\n case \"cardsByInexperience\":\n return this.formatInexperienceViewIndex(viewRows, baseResult);\n default:\n return this.formatGenericViewIndex(viewRows, baseResult);\n }\n }\n /**\n * Format ELO view results - convert to sorted array format\n */\n formatEloViewIndex(viewRows, baseResult) {\n const sortedResults = viewRows.sort((a, b) => {\n if (typeof a.key === \"number\" && typeof b.key === \"number\") {\n return a.key - b.key;\n }\n return 0;\n });\n return {\n ...baseResult,\n sorted: sortedResults,\n stats: {\n min: sortedResults[0]?.key || 0,\n max: sortedResults[sortedResults.length - 1]?.key || 0,\n count: sortedResults.length\n }\n };\n }\n /**\n * Format tags view results - convert to tag mapping format\n */\n formatTagsViewIndex(viewRows, baseResult) {\n const tagMap = {};\n for (const row of viewRows) {\n const tagName = row.key;\n if (typeof tagName === \"string\") {\n if (!tagMap[tagName]) {\n tagMap[tagName] = [];\n }\n tagMap[tagName].push(row.id);\n }\n }\n return {\n ...baseResult,\n byTag: tagMap,\n tagCount: Object.keys(tagMap).length\n };\n }\n /**\n * Format inexperience view results - convert to experience-based format\n */\n formatInexperienceViewIndex(viewRows, baseResult) {\n const sortedResults = viewRows.sort((a, b) => {\n if (typeof a.key === \"number\" && typeof b.key === \"number\") {\n return a.key - b.key;\n }\n return 0;\n });\n return {\n ...baseResult,\n sorted: sortedResults,\n stats: {\n minInexperience: sortedResults[0]?.key || 0,\n maxInexperience: sortedResults[sortedResults.length - 1]?.key || 0,\n count: sortedResults.length\n }\n };\n }\n /**\n * Format generic view results - fallback for unknown views\n */\n formatGenericViewIndex(_viewRows, baseResult) {\n return {\n ...baseResult\n // Keep results as-is for unknown view types\n };\n }\n /**\n * Extract all attachments from documents and download binary data\n */\n async extractAllAttachments(docsByType, attachments) {\n logger.info(\"Extracting attachments...\");\n const allDocs = [];\n for (const docs of Object.values(docsByType)) {\n allDocs.push(...docs);\n }\n const docsWithAttachments = allDocs.filter((doc) => doc._attachments && Object.keys(doc._attachments).length > 0);\n if (docsWithAttachments.length === 0) {\n logger.info(\"No attachments found\");\n return;\n }\n logger.info(`Found ${docsWithAttachments.length} documents with attachments`);\n const extractionPromises = docsWithAttachments.map(\n (doc) => this.extractDocumentAttachments(doc, attachments)\n );\n await Promise.all(extractionPromises);\n logger.info(`Extracted ${attachments.size} attachment files`);\n }\n /**\n * Extract attachments for a single document\n */\n async extractDocumentAttachments(doc, attachments) {\n if (!doc._attachments || !this.sourceDB) {\n return;\n }\n const docId = doc._id;\n for (const [attachmentName, metadata] of Object.entries(doc._attachments)) {\n try {\n const attachmentResponse = await this.sourceDB.getAttachment(docId, attachmentName);\n let buffer;\n if (attachmentResponse instanceof ArrayBuffer) {\n buffer = Buffer.from(attachmentResponse);\n } else if (Buffer.isBuffer(attachmentResponse)) {\n buffer = attachmentResponse;\n } else {\n const blob = attachmentResponse;\n buffer = Buffer.from(await blob.arrayBuffer());\n }\n const extension = this.getFileExtension(metadata.content_type);\n const filename = `${attachmentName}${extension}`;\n const attachmentPath = `attachments/${docId}/${filename}`;\n attachments.set(attachmentPath, {\n docId,\n attachmentName,\n filename,\n path: attachmentPath,\n contentType: metadata.content_type,\n length: metadata.length || buffer.length,\n digest: metadata.digest,\n buffer\n });\n logger.debug(`Extracted attachment: ${attachmentPath}`);\n } catch (error) {\n logger.error(`Failed to extract attachment ${docId}/${attachmentName}:`, error);\n throw new Error(`Failed to extract attachment ${docId}/${attachmentName}: ${error}`);\n }\n }\n }\n /**\n * Transform attachment stubs to include file paths\n */\n transformAttachmentStubs(attachments, docId) {\n const transformed = {};\n for (const [attachmentName, metadata] of Object.entries(attachments)) {\n const extension = this.getFileExtension(metadata.content_type);\n const filename = `${attachmentName}${extension}`;\n const attachmentPath = `attachments/${docId}/${filename}`;\n transformed[attachmentName] = {\n path: attachmentPath,\n content_type: metadata.content_type,\n length: metadata.length,\n digest: metadata.digest,\n stub: false\n // No longer a stub - we have the actual file\n };\n }\n return transformed;\n }\n /**\n * Get file extension from content type\n */\n getFileExtension(contentType) {\n const extensionMap = {\n \"image/jpeg\": \".jpg\",\n \"image/jpg\": \".jpg\",\n \"image/png\": \".png\",\n \"image/gif\": \".gif\",\n \"image/webp\": \".webp\",\n \"audio/mpeg\": \".mp3\",\n \"audio/mp3\": \".mp3\",\n \"audio/wav\": \".wav\",\n \"audio/ogg\": \".ogg\",\n \"video/mp4\": \".mp4\",\n \"video/webm\": \".webm\",\n \"application/pdf\": \".pdf\",\n \"text/plain\": \".txt\",\n \"application/json\": \".json\"\n };\n return extensionMap[contentType] || \"\";\n }\n};\n\n// src/util/migrator/StaticToCouchDBMigrator.ts\ninit_logger();\n\n// src/util/migrator/types.ts\nvar DEFAULT_MIGRATION_OPTIONS = {\n chunkBatchSize: 100,\n validateRoundTrip: false,\n cleanupOnFailure: true,\n timeout: 3e5\n // 5 minutes\n};\n\n// src/util/migrator/validation.ts\ninit_logger();\n\n// src/util/migrator/FileSystemAdapter.ts\nvar FileSystemError = class extends Error {\n constructor(message, operation, filePath, cause) {\n super(message);\n this.operation = operation;\n this.filePath = filePath;\n this.cause = cause;\n this.name = \"FileSystemError\";\n }\n};\n\n// src/util/migrator/validation.ts\nvar nodeFS2 = null;\ntry {\n if (typeof window === \"undefined\" && typeof process !== \"undefined\" && process.versions?.node) {\n nodeFS2 = eval(\"require\")(\"fs\");\n nodeFS2.promises = nodeFS2.promises || eval(\"require\")(\"fs\").promises;\n }\n} catch {\n}\nasync function validateStaticCourse(staticPath, fs2) {\n const validation = {\n valid: true,\n manifestExists: false,\n chunksExist: false,\n attachmentsExist: false,\n errors: [],\n warnings: []\n };\n try {\n if (fs2) {\n const stats = await fs2.stat(staticPath);\n if (!stats.isDirectory()) {\n validation.errors.push(`Path is not a directory: ${staticPath}`);\n validation.valid = false;\n return validation;\n }\n } else if (!nodeFS2) {\n validation.errors.push(\"File system access not available - validation skipped\");\n validation.valid = false;\n return validation;\n } else {\n const stats = await nodeFS2.promises.stat(staticPath);\n if (!stats.isDirectory()) {\n validation.errors.push(`Path is not a directory: ${staticPath}`);\n validation.valid = false;\n return validation;\n }\n }\n let manifestPath = `${staticPath}/manifest.json`;\n try {\n if (fs2) {\n manifestPath = fs2.joinPath(staticPath, \"manifest.json\");\n if (await fs2.exists(manifestPath)) {\n validation.manifestExists = true;\n const manifestContent = await fs2.readFile(manifestPath);\n const manifest = JSON.parse(manifestContent);\n validation.courseId = manifest.courseId;\n validation.courseName = manifest.courseName;\n if (!manifest.version || !manifest.courseId || !manifest.chunks || !Array.isArray(manifest.chunks)) {\n validation.errors.push(\"Invalid manifest structure\");\n validation.valid = false;\n }\n } else {\n validation.errors.push(`Manifest not found: ${manifestPath}`);\n validation.valid = false;\n }\n } else {\n manifestPath = `${staticPath}/manifest.json`;\n await nodeFS2.promises.access(manifestPath);\n validation.manifestExists = true;\n const manifestContent = await nodeFS2.promises.readFile(manifestPath, \"utf8\");\n const manifest = JSON.parse(manifestContent);\n validation.courseId = manifest.courseId;\n validation.courseName = manifest.courseName;\n if (!manifest.version || !manifest.courseId || !manifest.chunks || !Array.isArray(manifest.chunks)) {\n validation.errors.push(\"Invalid manifest structure\");\n validation.valid = false;\n }\n }\n } catch (error) {\n const errorMessage = error instanceof FileSystemError ? error.message : `Manifest not found or invalid: ${manifestPath}`;\n validation.errors.push(errorMessage);\n validation.valid = false;\n }\n let chunksPath = `${staticPath}/chunks`;\n try {\n if (fs2) {\n chunksPath = fs2.joinPath(staticPath, \"chunks\");\n if (await fs2.exists(chunksPath)) {\n const chunksStats = await fs2.stat(chunksPath);\n if (chunksStats.isDirectory()) {\n validation.chunksExist = true;\n } else {\n validation.errors.push(`Chunks path is not a directory: ${chunksPath}`);\n validation.valid = false;\n }\n } else {\n validation.errors.push(`Chunks directory not found: ${chunksPath}`);\n validation.valid = false;\n }\n } else {\n chunksPath = `${staticPath}/chunks`;\n const chunksStats = await nodeFS2.promises.stat(chunksPath);\n if (chunksStats.isDirectory()) {\n validation.chunksExist = true;\n } else {\n validation.errors.push(`Chunks path is not a directory: ${chunksPath}`);\n validation.valid = false;\n }\n }\n } catch (error) {\n const errorMessage = error instanceof FileSystemError ? error.message : `Chunks directory not found: ${chunksPath}`;\n validation.errors.push(errorMessage);\n validation.valid = false;\n }\n let attachmentsPath;\n try {\n if (fs2) {\n attachmentsPath = fs2.joinPath(staticPath, \"attachments\");\n if (await fs2.exists(attachmentsPath)) {\n const attachmentsStats = await fs2.stat(attachmentsPath);\n if (attachmentsStats.isDirectory()) {\n validation.attachmentsExist = true;\n }\n } else {\n validation.warnings.push(\n `Attachments directory not found: ${attachmentsPath} (this is OK if course has no attachments)`\n );\n }\n } else {\n attachmentsPath = `${staticPath}/attachments`;\n const attachmentsStats = await nodeFS2.promises.stat(attachmentsPath);\n if (attachmentsStats.isDirectory()) {\n validation.attachmentsExist = true;\n }\n }\n } catch (error) {\n attachmentsPath = attachmentsPath || `${staticPath}/attachments`;\n const warningMessage = error instanceof FileSystemError ? error.message : `Attachments directory not found: ${attachmentsPath} (this is OK if course has no attachments)`;\n validation.warnings.push(warningMessage);\n }\n } catch (error) {\n validation.errors.push(\n `Failed to validate static course: ${error instanceof Error ? error.message : String(error)}`\n );\n validation.valid = false;\n }\n return validation;\n}\nasync function validateMigration(targetDB, expectedCounts, manifest) {\n const validation = {\n valid: true,\n documentCountMatch: false,\n attachmentIntegrity: false,\n viewFunctionality: false,\n issues: []\n };\n try {\n logger.info(\"Starting migration validation...\");\n const actualCounts = await getActualDocumentCounts(targetDB);\n validation.documentCountMatch = compareDocumentCounts(\n expectedCounts,\n actualCounts,\n validation.issues\n );\n await validateCourseConfig(targetDB, manifest, validation.issues);\n validation.viewFunctionality = await validateViews(targetDB, manifest, validation.issues);\n validation.attachmentIntegrity = await validateAttachmentIntegrity(targetDB, validation.issues);\n validation.valid = validation.documentCountMatch && validation.viewFunctionality && validation.attachmentIntegrity;\n logger.info(`Migration validation completed. Valid: ${validation.valid}`);\n if (validation.issues.length > 0) {\n logger.info(`Validation issues: ${validation.issues.length}`);\n validation.issues.forEach((issue) => {\n if (issue.type === \"error\") {\n logger.error(`${issue.category}: ${issue.message}`);\n } else {\n logger.warn(`${issue.category}: ${issue.message}`);\n }\n });\n }\n } catch (error) {\n validation.valid = false;\n validation.issues.push({\n type: \"error\",\n category: \"metadata\",\n message: `Validation failed: ${error instanceof Error ? error.message : String(error)}`\n });\n }\n return validation;\n}\nasync function getActualDocumentCounts(db) {\n const counts = {};\n try {\n const allDocs = await db.allDocs({ include_docs: true });\n for (const row of allDocs.rows) {\n if (row.id.startsWith(\"_design/\")) {\n counts[\"_design\"] = (counts[\"_design\"] || 0) + 1;\n continue;\n }\n const doc = row.doc;\n if (doc && doc.docType) {\n counts[doc.docType] = (counts[doc.docType] || 0) + 1;\n } else {\n counts[\"unknown\"] = (counts[\"unknown\"] || 0) + 1;\n }\n }\n } catch (error) {\n logger.error(\"Failed to get actual document counts:\", error);\n }\n return counts;\n}\nfunction compareDocumentCounts(expected, actual, issues) {\n let countsMatch = true;\n for (const [docType, expectedCount] of Object.entries(expected)) {\n const actualCount = actual[docType] || 0;\n if (actualCount !== expectedCount) {\n countsMatch = false;\n issues.push({\n type: \"error\",\n category: \"documents\",\n message: `Document count mismatch for ${docType}: expected ${expectedCount}, got ${actualCount}`\n });\n }\n }\n for (const [docType, actualCount] of Object.entries(actual)) {\n if (!expected[docType] && docType !== \"_design\") {\n issues.push({\n type: \"warning\",\n category: \"documents\",\n message: `Unexpected document type found: ${docType} (${actualCount} documents)`\n });\n }\n }\n return countsMatch;\n}\nasync function validateCourseConfig(db, manifest, issues) {\n try {\n const courseConfig = await db.get(\"CourseConfig\");\n if (!courseConfig) {\n issues.push({\n type: \"error\",\n category: \"course_config\",\n message: \"CourseConfig document not found after migration\"\n });\n return;\n }\n if (!courseConfig.courseID) {\n issues.push({\n type: \"warning\",\n category: \"course_config\",\n message: \"CourseConfig document missing courseID field\"\n });\n }\n if (courseConfig.courseID !== manifest.courseId) {\n issues.push({\n type: \"warning\",\n category: \"course_config\",\n message: `CourseConfig courseID mismatch: expected ${manifest.courseId}, got ${courseConfig.courseID}`\n });\n }\n logger.debug(\"CourseConfig document validation passed\");\n } catch (error) {\n if (error.status === 404) {\n issues.push({\n type: \"error\",\n category: \"course_config\",\n message: \"CourseConfig document not found in database\"\n });\n } else {\n issues.push({\n type: \"error\",\n category: \"course_config\",\n message: `Failed to validate CourseConfig document: ${error instanceof Error ? error.message : String(error)}`\n });\n }\n }\n}\nasync function validateViews(db, manifest, issues) {\n let viewsValid = true;\n try {\n for (const designDoc of manifest.designDocs) {\n try {\n const doc = await db.get(designDoc._id);\n if (!doc) {\n viewsValid = false;\n issues.push({\n type: \"error\",\n category: \"views\",\n message: `Design document not found: ${designDoc._id}`\n });\n continue;\n }\n for (const viewName of Object.keys(designDoc.views)) {\n try {\n const viewPath = `${designDoc._id}/${viewName}`;\n await db.query(viewPath, { limit: 1 });\n } catch (viewError) {\n viewsValid = false;\n issues.push({\n type: \"error\",\n category: \"views\",\n message: `View not accessible: ${designDoc._id}/${viewName} - ${viewError}`\n });\n }\n }\n } catch (error) {\n viewsValid = false;\n issues.push({\n type: \"error\",\n category: \"views\",\n message: `Failed to validate design document ${designDoc._id}: ${error}`\n });\n }\n }\n } catch (error) {\n viewsValid = false;\n issues.push({\n type: \"error\",\n category: \"views\",\n message: `View validation failed: ${error instanceof Error ? error.message : String(error)}`\n });\n }\n return viewsValid;\n}\nasync function validateAttachmentIntegrity(db, issues) {\n let attachmentsValid = true;\n try {\n const allDocs = await db.allDocs({\n include_docs: true,\n limit: 10\n // Sample first 10 documents for performance\n });\n let attachmentCount = 0;\n let validAttachments = 0;\n for (const row of allDocs.rows) {\n const doc = row.doc;\n if (doc && doc._attachments) {\n for (const [attachmentName, _attachmentMeta] of Object.entries(doc._attachments)) {\n attachmentCount++;\n try {\n const attachment = await db.getAttachment(doc._id, attachmentName);\n if (attachment) {\n validAttachments++;\n }\n } catch (attachmentError) {\n attachmentsValid = false;\n issues.push({\n type: \"error\",\n category: \"attachments\",\n message: `Attachment not accessible: ${doc._id}/${attachmentName} - ${attachmentError}`\n });\n }\n }\n }\n }\n if (attachmentCount === 0) {\n issues.push({\n type: \"warning\",\n category: \"attachments\",\n message: \"No attachments found in sampled documents\"\n });\n } else {\n logger.info(`Validated ${validAttachments}/${attachmentCount} sampled attachments`);\n }\n } catch (error) {\n attachmentsValid = false;\n issues.push({\n type: \"error\",\n category: \"attachments\",\n message: `Attachment validation failed: ${error instanceof Error ? error.message : String(error)}`\n });\n }\n return attachmentsValid;\n}\n\n// src/util/migrator/StaticToCouchDBMigrator.ts\nvar nodeFS3 = null;\nvar nodePath = null;\ntry {\n if (typeof window === \"undefined\" && typeof process !== \"undefined\" && process.versions?.node) {\n nodeFS3 = eval(\"require\")(\"fs\");\n nodePath = eval(\"require\")(\"path\");\n nodeFS3.promises = nodeFS3.promises || eval(\"require\")(\"fs\").promises;\n }\n} catch {\n}\nvar StaticToCouchDBMigrator = class {\n options;\n progressCallback;\n fs;\n constructor(options = {}, fileSystemAdapter) {\n this.options = {\n ...DEFAULT_MIGRATION_OPTIONS,\n ...options\n };\n this.fs = fileSystemAdapter;\n }\n /**\n * Set a progress callback to receive updates during migration\n */\n setProgressCallback(callback) {\n this.progressCallback = callback;\n }\n /**\n * Migrate a static course to CouchDB\n */\n async migrateCourse(staticPath, targetDB) {\n const startTime = Date.now();\n const result = {\n success: false,\n documentsRestored: 0,\n attachmentsRestored: 0,\n designDocsRestored: 0,\n courseConfigRestored: 0,\n errors: [],\n warnings: [],\n migrationTime: 0\n };\n try {\n logger.info(`Starting migration from ${staticPath} to CouchDB`);\n this.reportProgress(\"manifest\", 0, 1, \"Validating static course...\");\n const validation = await validateStaticCourse(staticPath, this.fs);\n if (!validation.valid) {\n result.errors.push(...validation.errors);\n throw new Error(`Static course validation failed: ${validation.errors.join(\", \")}`);\n }\n result.warnings.push(...validation.warnings);\n this.reportProgress(\"manifest\", 1, 1, \"Loading course manifest...\");\n const manifest = await this.loadManifest(staticPath);\n logger.info(`Loaded manifest for course: ${manifest.courseId} (${manifest.courseName})`);\n this.reportProgress(\n \"design_docs\",\n 0,\n manifest.designDocs.length,\n \"Restoring design documents...\"\n );\n const designDocResults = await this.restoreDesignDocuments(manifest.designDocs, targetDB);\n result.designDocsRestored = designDocResults.restored;\n result.errors.push(...designDocResults.errors);\n result.warnings.push(...designDocResults.warnings);\n this.reportProgress(\"course_config\", 0, 1, \"Restoring CourseConfig document...\");\n const courseConfigResults = await this.restoreCourseConfig(manifest, targetDB);\n result.courseConfigRestored = courseConfigResults.restored;\n result.errors.push(...courseConfigResults.errors);\n result.warnings.push(...courseConfigResults.warnings);\n this.reportProgress(\"course_config\", 1, 1, \"CourseConfig document restored\");\n const expectedCounts = this.calculateExpectedCounts(manifest);\n this.reportProgress(\n \"documents\",\n 0,\n manifest.documentCount,\n \"Aggregating documents from chunks...\"\n );\n const documents = await this.aggregateDocuments(staticPath, manifest);\n const filteredDocuments = documents.filter((doc) => doc._id !== \"CourseConfig\");\n if (documents.length !== filteredDocuments.length) {\n result.warnings.push(\n `Filtered out ${documents.length - filteredDocuments.length} CourseConfig document(s) from chunks to prevent conflicts`\n );\n }\n this.reportProgress(\n \"documents\",\n filteredDocuments.length,\n manifest.documentCount,\n \"Uploading documents to CouchDB...\"\n );\n const docResults = await this.uploadDocuments(filteredDocuments, targetDB);\n result.documentsRestored = docResults.restored;\n result.errors.push(...docResults.errors);\n result.warnings.push(...docResults.warnings);\n const docsWithAttachments = documents.filter(\n (doc) => doc._attachments && Object.keys(doc._attachments).length > 0\n );\n this.reportProgress(\"attachments\", 0, docsWithAttachments.length, \"Uploading attachments...\");\n const attachmentResults = await this.uploadAttachments(\n staticPath,\n docsWithAttachments,\n targetDB\n );\n result.attachmentsRestored = attachmentResults.restored;\n result.errors.push(...attachmentResults.errors);\n result.warnings.push(...attachmentResults.warnings);\n if (this.options.validateRoundTrip) {\n this.reportProgress(\"validation\", 0, 1, \"Validating migration...\");\n const validationResult = await validateMigration(targetDB, expectedCounts, manifest);\n if (!validationResult.valid) {\n result.warnings.push(\"Migration validation found issues\");\n validationResult.issues.forEach((issue) => {\n if (issue.type === \"error\") {\n result.errors.push(`Validation: ${issue.message}`);\n } else {\n result.warnings.push(`Validation: ${issue.message}`);\n }\n });\n }\n this.reportProgress(\"validation\", 1, 1, \"Migration validation completed\");\n }\n result.success = result.errors.length === 0;\n result.migrationTime = Date.now() - startTime;\n logger.info(`Migration completed in ${result.migrationTime}ms`);\n logger.info(`Documents restored: ${result.documentsRestored}`);\n logger.info(`Attachments restored: ${result.attachmentsRestored}`);\n logger.info(`Design docs restored: ${result.designDocsRestored}`);\n logger.info(`CourseConfig restored: ${result.courseConfigRestored}`);\n if (result.errors.length > 0) {\n logger.error(`Migration completed with ${result.errors.length} errors`);\n }\n if (result.warnings.length > 0) {\n logger.warn(`Migration completed with ${result.warnings.length} warnings`);\n }\n } catch (error) {\n result.success = false;\n result.migrationTime = Date.now() - startTime;\n const errorMessage = error instanceof Error ? error.message : String(error);\n result.errors.push(`Migration failed: ${errorMessage}`);\n logger.error(\"Migration failed:\", error);\n if (this.options.cleanupOnFailure) {\n try {\n await this.cleanupFailedMigration(targetDB);\n } catch (cleanupError) {\n logger.error(\"Failed to cleanup after migration failure:\", cleanupError);\n result.warnings.push(\"Failed to cleanup after migration failure\");\n }\n }\n }\n return result;\n }\n /**\n * Load and parse the manifest file\n */\n async loadManifest(staticPath) {\n try {\n let manifestContent;\n let manifestPath;\n if (this.fs) {\n manifestPath = this.fs.joinPath(staticPath, \"manifest.json\");\n manifestContent = await this.fs.readFile(manifestPath);\n } else {\n manifestPath = nodeFS3 && nodePath ? nodePath.join(staticPath, \"manifest.json\") : `${staticPath}/manifest.json`;\n if (nodeFS3 && this.isLocalPath(staticPath)) {\n manifestContent = await nodeFS3.promises.readFile(manifestPath, \"utf8\");\n } else {\n const response = await fetch(manifestPath);\n if (!response.ok) {\n throw new Error(`Failed to fetch manifest: ${response.status} ${response.statusText}`);\n }\n manifestContent = await response.text();\n }\n }\n const manifest = JSON.parse(manifestContent);\n if (!manifest.version || !manifest.courseId || !manifest.chunks) {\n throw new Error(\"Invalid manifest structure\");\n }\n return manifest;\n } catch (error) {\n const errorMessage = error instanceof FileSystemError ? error.message : `Failed to load manifest: ${error instanceof Error ? error.message : String(error)}`;\n throw new Error(errorMessage);\n }\n }\n /**\n * Restore design documents to CouchDB\n */\n async restoreDesignDocuments(designDocs, db) {\n const result = { restored: 0, errors: [], warnings: [] };\n for (let i = 0; i < designDocs.length; i++) {\n const designDoc = designDocs[i];\n this.reportProgress(\"design_docs\", i, designDocs.length, `Restoring ${designDoc._id}...`);\n try {\n let existingDoc;\n try {\n existingDoc = await db.get(designDoc._id);\n } catch {\n }\n const docToInsert = {\n _id: designDoc._id,\n views: designDoc.views\n };\n if (existingDoc) {\n docToInsert._rev = existingDoc._rev;\n logger.debug(`Updating existing design document: ${designDoc._id}`);\n } else {\n logger.debug(`Creating new design document: ${designDoc._id}`);\n }\n await db.put(docToInsert);\n result.restored++;\n } catch (error) {\n const errorMessage = `Failed to restore design document ${designDoc._id}: ${error instanceof Error ? error.message : String(error)}`;\n result.errors.push(errorMessage);\n logger.error(errorMessage);\n }\n }\n this.reportProgress(\n \"design_docs\",\n designDocs.length,\n designDocs.length,\n `Restored ${result.restored} design documents`\n );\n return result;\n }\n /**\n * Aggregate documents from all chunks\n */\n async aggregateDocuments(staticPath, manifest) {\n const allDocuments = [];\n const documentMap = /* @__PURE__ */ new Map();\n for (let i = 0; i < manifest.chunks.length; i++) {\n const chunk = manifest.chunks[i];\n this.reportProgress(\n \"documents\",\n allDocuments.length,\n manifest.documentCount,\n `Loading chunk ${chunk.id}...`\n );\n try {\n const documents = await this.loadChunk(staticPath, chunk);\n for (const doc of documents) {\n if (!doc._id) {\n logger.warn(`Document without _id found in chunk ${chunk.id}, skipping`);\n continue;\n }\n if (documentMap.has(doc._id)) {\n logger.warn(`Duplicate document ID found: ${doc._id}, using latest version`);\n }\n documentMap.set(doc._id, doc);\n }\n } catch (error) {\n throw new Error(\n `Failed to load chunk ${chunk.id}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n allDocuments.push(...documentMap.values());\n logger.info(\n `Aggregated ${allDocuments.length} unique documents from ${manifest.chunks.length} chunks`\n );\n return allDocuments;\n }\n /**\n * Load documents from a single chunk file\n */\n async loadChunk(staticPath, chunk) {\n try {\n let chunkContent;\n let chunkPath;\n if (this.fs) {\n chunkPath = this.fs.joinPath(staticPath, chunk.path);\n chunkContent = await this.fs.readFile(chunkPath);\n } else {\n chunkPath = nodeFS3 && nodePath ? nodePath.join(staticPath, chunk.path) : `${staticPath}/${chunk.path}`;\n if (nodeFS3 && this.isLocalPath(staticPath)) {\n chunkContent = await nodeFS3.promises.readFile(chunkPath, \"utf8\");\n } else {\n const response = await fetch(chunkPath);\n if (!response.ok) {\n throw new Error(`Failed to fetch chunk: ${response.status} ${response.statusText}`);\n }\n chunkContent = await response.text();\n }\n }\n const documents = JSON.parse(chunkContent);\n if (!Array.isArray(documents)) {\n throw new Error(\"Chunk file does not contain an array of documents\");\n }\n return documents;\n } catch (error) {\n const errorMessage = error instanceof FileSystemError ? error.message : `Failed to load chunk: ${error instanceof Error ? error.message : String(error)}`;\n throw new Error(errorMessage);\n }\n }\n /**\n * Upload documents to CouchDB in batches\n */\n async uploadDocuments(documents, db) {\n const result = { restored: 0, errors: [], warnings: [] };\n const batchSize = this.options.chunkBatchSize;\n for (let i = 0; i < documents.length; i += batchSize) {\n const batch = documents.slice(i, i + batchSize);\n this.reportProgress(\n \"documents\",\n i,\n documents.length,\n `Uploading batch ${Math.floor(i / batchSize) + 1}...`\n );\n try {\n const docsToInsert = batch.map((doc) => {\n const cleanDoc = { ...doc };\n delete cleanDoc._rev;\n delete cleanDoc._attachments;\n return cleanDoc;\n });\n const bulkResult = await db.bulkDocs(docsToInsert);\n for (let j = 0; j < bulkResult.length; j++) {\n const docResult = bulkResult[j];\n const originalDoc = batch[j];\n if (\"error\" in docResult) {\n const errorMessage = `Failed to upload document ${originalDoc._id}: ${docResult.error} - ${docResult.reason}`;\n result.errors.push(errorMessage);\n logger.error(errorMessage);\n } else {\n result.restored++;\n }\n }\n } catch (error) {\n let errorMessage;\n if (error instanceof Error) {\n errorMessage = `Failed to upload document batch starting at index ${i}: ${error.message}`;\n } else if (error && typeof error === \"object\" && \"message\" in error) {\n errorMessage = `Failed to upload document batch starting at index ${i}: ${error.message}`;\n } else {\n errorMessage = `Failed to upload document batch starting at index ${i}: ${JSON.stringify(error)}`;\n }\n result.errors.push(errorMessage);\n logger.error(errorMessage);\n }\n }\n this.reportProgress(\n \"documents\",\n documents.length,\n documents.length,\n `Uploaded ${result.restored} documents`\n );\n return result;\n }\n /**\n * Upload attachments from filesystem to CouchDB\n */\n async uploadAttachments(staticPath, documents, db) {\n const result = { restored: 0, errors: [], warnings: [] };\n let processedDocs = 0;\n for (const doc of documents) {\n this.reportProgress(\n \"attachments\",\n processedDocs,\n documents.length,\n `Processing attachments for ${doc._id}...`\n );\n processedDocs++;\n if (!doc._attachments) {\n continue;\n }\n for (const [attachmentName, attachmentMeta] of Object.entries(doc._attachments)) {\n try {\n const uploadResult = await this.uploadSingleAttachment(\n staticPath,\n doc._id,\n attachmentName,\n attachmentMeta,\n db\n );\n if (uploadResult.success) {\n result.restored++;\n } else {\n result.errors.push(uploadResult.error || \"Unknown attachment upload error\");\n }\n } catch (error) {\n const errorMessage = `Failed to upload attachment ${doc._id}/${attachmentName}: ${error instanceof Error ? error.message : String(error)}`;\n result.errors.push(errorMessage);\n logger.error(errorMessage);\n }\n }\n }\n this.reportProgress(\n \"attachments\",\n documents.length,\n documents.length,\n `Uploaded ${result.restored} attachments`\n );\n return result;\n }\n /**\n * Upload a single attachment file\n */\n async uploadSingleAttachment(staticPath, docId, attachmentName, attachmentMeta, db) {\n const result = {\n success: false,\n attachmentName,\n docId\n };\n try {\n if (!attachmentMeta.path) {\n result.error = \"Attachment metadata missing file path\";\n return result;\n }\n let attachmentData;\n let attachmentPath;\n if (this.fs) {\n attachmentPath = this.fs.joinPath(staticPath, attachmentMeta.path);\n attachmentData = await this.fs.readBinary(attachmentPath);\n } else {\n attachmentPath = nodeFS3 && nodePath ? nodePath.join(staticPath, attachmentMeta.path) : `${staticPath}/${attachmentMeta.path}`;\n if (nodeFS3 && this.isLocalPath(staticPath)) {\n attachmentData = await nodeFS3.promises.readFile(attachmentPath);\n } else {\n const response = await fetch(attachmentPath);\n if (!response.ok) {\n result.error = `Failed to fetch attachment: ${response.status} ${response.statusText}`;\n return result;\n }\n attachmentData = await response.arrayBuffer();\n }\n }\n const doc = await db.get(docId);\n await db.putAttachment(\n docId,\n attachmentName,\n doc._rev,\n attachmentData,\n // PouchDB accepts both ArrayBuffer and Buffer\n attachmentMeta.content_type\n );\n result.success = true;\n } catch (error) {\n result.error = error instanceof Error ? error.message : String(error);\n }\n return result;\n }\n /**\n * Restore CourseConfig document from manifest\n */\n async restoreCourseConfig(manifest, targetDB) {\n const results = {\n restored: 0,\n errors: [],\n warnings: []\n };\n try {\n if (!manifest.courseConfig) {\n results.warnings.push(\n \"No courseConfig found in manifest, skipping CourseConfig document creation\"\n );\n return results;\n }\n const courseConfigDoc = {\n _id: \"CourseConfig\",\n ...manifest.courseConfig,\n courseID: manifest.courseId\n };\n delete courseConfigDoc._rev;\n await targetDB.put(courseConfigDoc);\n results.restored = 1;\n logger.info(`CourseConfig document created for course: ${manifest.courseId}`);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : JSON.stringify(error);\n results.errors.push(`Failed to restore CourseConfig: ${errorMessage}`);\n logger.error(\"CourseConfig restoration failed:\", error);\n }\n return results;\n }\n /**\n * Calculate expected document counts from manifest\n */\n calculateExpectedCounts(manifest) {\n const counts = {};\n for (const chunk of manifest.chunks) {\n counts[chunk.docType] = (counts[chunk.docType] || 0) + chunk.documentCount;\n }\n if (manifest.designDocs.length > 0) {\n counts[\"_design\"] = manifest.designDocs.length;\n }\n return counts;\n }\n /**\n * Clean up database after failed migration\n */\n async cleanupFailedMigration(db) {\n logger.info(\"Cleaning up failed migration...\");\n try {\n const allDocs = await db.allDocs();\n const docsToDelete = allDocs.rows.map((row) => ({\n _id: row.id,\n _rev: row.value.rev,\n _deleted: true\n }));\n if (docsToDelete.length > 0) {\n await db.bulkDocs(docsToDelete);\n logger.info(`Cleaned up ${docsToDelete.length} documents from failed migration`);\n }\n } catch (error) {\n logger.error(\"Failed to cleanup documents:\", error);\n throw error;\n }\n }\n /**\n * Report progress to callback if available\n */\n reportProgress(phase, current, total, message) {\n if (this.progressCallback) {\n this.progressCallback({\n phase,\n current,\n total,\n message\n });\n }\n }\n /**\n * Check if a path is a local file path (vs URL)\n */\n isLocalPath(path2) {\n return !path2.startsWith(\"http://\") && !path2.startsWith(\"https://\");\n }\n};\n\n// src/util/index.ts\ninit_dataDirectory();\n\n// src/study/SessionController.ts\ninit_navigators();\n\n// src/study/SourceMixer.ts\nvar QuotaRoundRobinMixer = class {\n mix(batches, limit) {\n if (batches.length === 0) {\n return [];\n }\n const quotaPerSource = Math.ceil(limit / batches.length);\n const sourceStacks = batches.map((batch) => {\n return [...batch.weighted].sort((a, b) => b.score - a.score).slice(0, quotaPerSource);\n });\n for (let i = sourceStacks.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [sourceStacks[i], sourceStacks[j]] = [sourceStacks[j], sourceStacks[i]];\n }\n const result = [];\n let exhausted = 0;\n const cursors = new Array(sourceStacks.length).fill(0);\n while (result.length < limit && exhausted < sourceStacks.length) {\n exhausted = 0;\n for (let s = 0; s < sourceStacks.length; s++) {\n if (result.length >= limit) break;\n if (cursors[s] < sourceStacks[s].length) {\n result.push(sourceStacks[s][cursors[s]]);\n cursors[s]++;\n } else {\n exhausted++;\n }\n }\n }\n return result;\n }\n};\n\n// src/study/MixerDebugger.ts\ninit_logger();\ninit_navigators();\nvar MAX_RUNS2 = 10;\nvar runHistory2 = [];\nfunction buildSourceSummary(batch, sourceId, sourceName) {\n const scores = batch.weighted.map((c) => c.score);\n const reviewCount = batch.weighted.filter((c) => getCardOrigin(c) === \"review\").length;\n const newCount = batch.weighted.filter((c) => getCardOrigin(c) === \"new\").length;\n return {\n sourceIndex: batch.sourceIndex,\n sourceId,\n sourceName,\n totalCards: batch.weighted.length,\n reviewCount,\n newCount,\n topScore: scores.length > 0 ? Math.max(...scores) : 0,\n bottomScore: scores.length > 0 ? Math.min(...scores) : 0,\n scoreRange: scores.length > 0 ? [Math.min(...scores), Math.max(...scores)] : [0, 0],\n avgScore: scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0\n };\n}\nfunction buildSourceBreakdown(sourceId, sourceName, allCards) {\n const sourceCards = allCards.filter((c) => c.courseId === sourceId);\n const selectedCards = sourceCards.filter((c) => c.selected);\n const reviewsProvided = sourceCards.filter((c) => c.origin === \"review\").length;\n const newProvided = sourceCards.filter((c) => c.origin === \"new\").length;\n const reviewsSelected = selectedCards.filter((c) => c.origin === \"review\").length;\n const newSelected = selectedCards.filter((c) => c.origin === \"new\").length;\n return {\n sourceId,\n sourceName,\n reviewsProvided,\n newProvided,\n reviewsSelected,\n newSelected,\n totalSelected: selectedCards.length,\n selectionRate: sourceCards.length > 0 ? selectedCards.length / sourceCards.length * 100 : 0\n };\n}\nfunction captureMixerRun(mixerType, batches, sourceIds, sourceNames, requestedLimit, quotaPerSource, mixedResult) {\n const sourceSummaries = batches.map(\n (batch, idx) => buildSourceSummary(batch, sourceIds[idx] || `source-${idx}`, sourceNames[idx])\n );\n const selectedIds = new Set(mixedResult.map((c) => c.cardId));\n const sourceRankings = /* @__PURE__ */ new Map();\n batches.forEach((batch) => {\n const sorted = [...batch.weighted].sort((a, b) => b.score - a.score);\n const rankings = /* @__PURE__ */ new Map();\n sorted.forEach((card, idx) => {\n rankings.set(card.cardId, idx + 1);\n });\n sourceRankings.set(sourceIds[batch.sourceIndex] || `source-${batch.sourceIndex}`, rankings);\n });\n const mixRankings = /* @__PURE__ */ new Map();\n mixedResult.forEach((card, idx) => {\n mixRankings.set(card.cardId, idx + 1);\n });\n const allCardsMap = /* @__PURE__ */ new Map();\n batches.forEach((batch) => {\n batch.weighted.forEach((card) => {\n allCardsMap.set(card.cardId, card);\n });\n });\n const cards = Array.from(allCardsMap.values()).map((card) => ({\n cardId: card.cardId,\n courseId: card.courseId,\n origin: getCardOrigin(card),\n score: card.score,\n sourceIndex: batches.findIndex((b) => b.weighted.some((c) => c.cardId === card.cardId)),\n selected: selectedIds.has(card.cardId),\n rankInSource: sourceRankings.get(card.courseId)?.get(card.cardId),\n rankInMix: mixRankings.get(card.cardId)\n }));\n const uniqueSourceIds = Array.from(new Set(sourceIds.filter((id) => id)));\n const sourceBreakdowns = uniqueSourceIds.map(\n (sourceId, idx) => buildSourceBreakdown(sourceId, sourceNames[idx], cards)\n );\n const report = {\n runId: `mix-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n timestamp: /* @__PURE__ */ new Date(),\n mixerType,\n requestedLimit,\n quotaPerSource,\n sourceSummaries,\n cards,\n finalCount: mixedResult.length,\n reviewsSelected: mixedResult.filter((c) => getCardOrigin(c) === \"review\").length,\n newSelected: mixedResult.filter((c) => getCardOrigin(c) === \"new\").length,\n sourceBreakdowns\n };\n runHistory2.unshift(report);\n if (runHistory2.length > MAX_RUNS2) {\n runHistory2.pop();\n }\n}\nfunction printMixerSummary(run) {\n console.group(`\\u{1F3A8} Mixer Run: ${run.mixerType}`);\n logger.info(`Run ID: ${run.runId}`);\n logger.info(`Time: ${run.timestamp.toISOString()}`);\n logger.info(\n `Config: limit=${run.requestedLimit}${run.quotaPerSource ? `, quota/source=${run.quotaPerSource}` : \"\"}`\n );\n console.group(`\\u{1F4E5} Input: ${run.sourceSummaries.length} sources`);\n for (const src of run.sourceSummaries) {\n logger.info(\n ` ${src.sourceName || src.sourceId}: ${src.totalCards} cards (${src.reviewCount} reviews, ${src.newCount} new)`\n );\n logger.info(` Score range: [${src.scoreRange[0].toFixed(2)}, ${src.scoreRange[1].toFixed(2)}], avg: ${src.avgScore.toFixed(2)}`);\n }\n console.groupEnd();\n console.group(`\\u{1F4E4} Output: ${run.finalCount} cards selected (${run.reviewsSelected} reviews, ${run.newSelected} new)`);\n for (const breakdown of run.sourceBreakdowns) {\n const name = breakdown.sourceName || breakdown.sourceId;\n logger.info(\n ` ${name}: ${breakdown.totalSelected} selected (${breakdown.reviewsSelected} reviews, ${breakdown.newSelected} new) - ${breakdown.selectionRate.toFixed(1)}% selection rate`\n );\n }\n console.groupEnd();\n console.groupEnd();\n}\nvar mixerDebugAPI = {\n /**\n * Get raw run history for programmatic access.\n */\n get runs() {\n return [...runHistory2];\n },\n /**\n * Show summary of a specific mixer run.\n */\n showRun(idOrIndex = 0) {\n if (runHistory2.length === 0) {\n logger.info(\"[Mixer Debug] No runs captured yet.\");\n return;\n }\n let run;\n if (typeof idOrIndex === \"number\") {\n run = runHistory2[idOrIndex];\n if (!run) {\n logger.info(`[Mixer Debug] No run found at index ${idOrIndex}. History length: ${runHistory2.length}`);\n return;\n }\n } else {\n run = runHistory2.find((r) => r.runId.endsWith(idOrIndex));\n if (!run) {\n logger.info(`[Mixer Debug] No run found matching ID '${idOrIndex}'.`);\n return;\n }\n }\n printMixerSummary(run);\n },\n /**\n * Show summary of the last mixer run.\n */\n showLastMix() {\n this.showRun(0);\n },\n /**\n * Explain source balance in the last run.\n */\n explainSourceBalance() {\n if (runHistory2.length === 0) {\n logger.info(\"[Mixer Debug] No runs captured yet.\");\n return;\n }\n const run = runHistory2[0];\n console.group(\"\\u2696\\uFE0F Source Balance Analysis\");\n logger.info(`Mixer: ${run.mixerType}`);\n logger.info(`Requested limit: ${run.requestedLimit}`);\n if (run.quotaPerSource) {\n logger.info(`Quota per source: ${run.quotaPerSource}`);\n }\n console.group(\"Input Distribution:\");\n for (const src of run.sourceSummaries) {\n const name = src.sourceName || src.sourceId;\n logger.info(`${name}:`);\n logger.info(` Provided: ${src.totalCards} cards (${src.reviewCount} reviews, ${src.newCount} new)`);\n logger.info(` Score range: [${src.scoreRange[0].toFixed(2)}, ${src.scoreRange[1].toFixed(2)}]`);\n }\n console.groupEnd();\n console.group(\"Selection Results:\");\n for (const breakdown of run.sourceBreakdowns) {\n const name = breakdown.sourceName || breakdown.sourceId;\n logger.info(`${name}:`);\n logger.info(\n ` Selected: ${breakdown.totalSelected}/${breakdown.reviewsProvided + breakdown.newProvided} (${breakdown.selectionRate.toFixed(1)}%)`\n );\n logger.info(` Reviews: ${breakdown.reviewsSelected}/${breakdown.reviewsProvided}`);\n logger.info(` New: ${breakdown.newSelected}/${breakdown.newProvided}`);\n if (breakdown.reviewsProvided > 0 && breakdown.reviewsSelected === 0) {\n logger.info(` \\u26A0\\uFE0F Had reviews but none selected!`);\n }\n if (breakdown.totalSelected === 0 && breakdown.reviewsProvided + breakdown.newProvided > 0) {\n logger.info(` \\u26A0\\uFE0F Had cards but none selected!`);\n }\n }\n console.groupEnd();\n const selectionRates = run.sourceBreakdowns.map((b) => b.selectionRate);\n const avgRate = selectionRates.reduce((a, b) => a + b, 0) / selectionRates.length;\n const maxDeviation = Math.max(...selectionRates.map((r) => Math.abs(r - avgRate)));\n if (maxDeviation > 20) {\n logger.info(`\n\\u26A0\\uFE0F Significant imbalance detected (max deviation: ${maxDeviation.toFixed(1)}%)`);\n logger.info(\"Possible causes:\");\n logger.info(\" - Score range differences between sources\");\n logger.info(\" - One source has much better quality cards\");\n logger.info(\" - Different card availability (reviews vs new)\");\n }\n console.groupEnd();\n },\n /**\n * Compare score distributions across sources.\n */\n compareScores() {\n if (runHistory2.length === 0) {\n logger.info(\"[Mixer Debug] No runs captured yet.\");\n return;\n }\n const run = runHistory2[0];\n console.group(\"\\u{1F4CA} Score Distribution Comparison\");\n console.table(\n run.sourceSummaries.map((src) => ({\n source: src.sourceName || src.sourceId,\n cards: src.totalCards,\n min: src.bottomScore.toFixed(3),\n max: src.topScore.toFixed(3),\n avg: src.avgScore.toFixed(3),\n range: (src.topScore - src.bottomScore).toFixed(3)\n }))\n );\n const ranges = run.sourceSummaries.map((s) => s.topScore - s.bottomScore);\n const avgScores = run.sourceSummaries.map((s) => s.avgScore);\n const rangeDiff = Math.max(...ranges) - Math.min(...ranges);\n const avgDiff = Math.max(...avgScores) - Math.min(...avgScores);\n if (rangeDiff > 0.3 || avgDiff > 0.2) {\n logger.info(\"\\n\\u26A0\\uFE0F Significant score distribution differences detected\");\n logger.info(\n \"This may cause one source to dominate selection if using global sorting (not quota-based)\"\n );\n }\n console.groupEnd();\n },\n /**\n * Show detailed information for a specific card.\n */\n showCard(cardId) {\n for (const run of runHistory2) {\n const card = run.cards.find((c) => c.cardId === cardId);\n if (card) {\n const source = run.sourceSummaries.find((s) => s.sourceIndex === card.sourceIndex);\n console.group(`\\u{1F3B4} Card: ${cardId}`);\n logger.info(`Course: ${card.courseId}`);\n logger.info(`Source: ${source?.sourceName || source?.sourceId || \"unknown\"}`);\n logger.info(`Origin: ${card.origin}`);\n logger.info(`Score: ${card.score.toFixed(3)}`);\n if (card.rankInSource) {\n logger.info(`Rank in source: #${card.rankInSource}`);\n }\n if (card.rankInMix) {\n logger.info(`Rank in mixed results: #${card.rankInMix}`);\n }\n logger.info(`Selected: ${card.selected ? \"Yes \\u2705\" : \"No \\u274C\"}`);\n if (!card.selected && card.rankInSource) {\n logger.info(\"\\nWhy not selected:\");\n if (run.quotaPerSource && card.rankInSource > run.quotaPerSource) {\n logger.info(` - Ranked #${card.rankInSource} in source, but quota was ${run.quotaPerSource}`);\n }\n logger.info(\" - Check score compared to selected cards using .showRun()\");\n }\n console.groupEnd();\n return;\n }\n }\n logger.info(`[Mixer Debug] Card '${cardId}' not found in recent runs.`);\n },\n /**\n * Show all runs in compact format.\n */\n listRuns() {\n if (runHistory2.length === 0) {\n logger.info(\"[Mixer Debug] No runs captured yet.\");\n return;\n }\n console.table(\n runHistory2.map((r) => ({\n id: r.runId.slice(-8),\n time: r.timestamp.toLocaleTimeString(),\n mixer: r.mixerType,\n sources: r.sourceSummaries.length,\n selected: r.finalCount,\n reviews: r.reviewsSelected,\n new: r.newSelected\n }))\n );\n },\n /**\n * Export run history as JSON for bug reports.\n */\n export() {\n const json = JSON.stringify(runHistory2, null, 2);\n logger.info(\"[Mixer Debug] Run history exported. Copy the returned string or use:\");\n logger.info(\" copy(window.skuilder.mixer.export())\");\n return json;\n },\n /**\n * Clear run history.\n */\n clear() {\n runHistory2.length = 0;\n logger.info(\"[Mixer Debug] Run history cleared.\");\n },\n /**\n * Show help.\n */\n help() {\n logger.info(`\n\\u{1F3A8} Mixer Debug API\n\nCommands:\n .showLastMix() Show summary of most recent mixer run\n .showRun(id|index) Show summary of a specific run (by index or ID suffix)\n .explainSourceBalance() Analyze source balance and selection patterns\n .compareScores() Compare score distributions across sources\n .showCard(cardId) Show mixer decisions for a specific card\n .listRuns() List all captured runs in table format\n .export() Export run history as JSON for bug reports\n .clear() Clear run history\n .runs Access raw run history array\n .help() Show this help message\n\nExample:\n window.skuilder.mixer.showLastMix()\n window.skuilder.mixer.explainSourceBalance()\n window.skuilder.mixer.compareScores()\n`);\n }\n};\nfunction mountMixerDebugger() {\n if (typeof window === \"undefined\") return;\n const win = window;\n win.skuilder = win.skuilder || {};\n win.skuilder.mixer = mixerDebugAPI;\n}\nmountMixerDebugger();\n\n// src/study/SessionDebugger.ts\ninit_logger();\nvar activeSession = null;\nvar sessionHistory = [];\nvar MAX_HISTORY = 5;\nfunction startSessionTracking(reviewQLength, newQLength, failedQLength) {\n const sessionId = `session-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n activeSession = {\n sessionId,\n startTime: /* @__PURE__ */ new Date(),\n initialQueues: {\n timestamp: /* @__PURE__ */ new Date(),\n reviewQLength,\n newQLength,\n failedQLength\n },\n presentations: [],\n queueSnapshots: []\n };\n logger.debug(`[SessionDebugger] Started tracking session: ${sessionId}`);\n}\nfunction recordCardPresentation(cardId, courseId, courseName, origin, queueSource, score) {\n if (!activeSession) {\n logger.warn(\"[SessionDebugger] No active session to record presentation\");\n return;\n }\n activeSession.presentations.push({\n timestamp: /* @__PURE__ */ new Date(),\n sequenceNumber: activeSession.presentations.length + 1,\n cardId,\n courseId,\n courseName,\n origin,\n queueSource,\n score\n });\n}\nfunction snapshotQueues(reviewQLength, newQLength, failedQLength, reviewQNext3, newQNext3) {\n if (!activeSession) {\n return;\n }\n activeSession.queueSnapshots.push({\n timestamp: /* @__PURE__ */ new Date(),\n reviewQLength,\n newQLength,\n failedQLength,\n reviewQNext3,\n newQNext3\n });\n}\nfunction endSessionTracking() {\n if (!activeSession) {\n return;\n }\n activeSession.endTime = /* @__PURE__ */ new Date();\n sessionHistory.unshift(activeSession);\n if (sessionHistory.length > MAX_HISTORY) {\n sessionHistory.pop();\n }\n logger.debug(`[SessionDebugger] Ended session: ${activeSession.sessionId}`);\n activeSession = null;\n}\nfunction showCurrentQueue() {\n if (!activeSession) {\n logger.info(\"[Session Debug] No active session.\");\n return;\n }\n const latest = activeSession.queueSnapshots[activeSession.queueSnapshots.length - 1] || activeSession.initialQueues;\n console.group(\"\\u{1F4CA} Current Queue State\");\n logger.info(`Review Queue: ${latest.reviewQLength} cards`);\n if (latest.reviewQNext3 && latest.reviewQNext3.length > 0) {\n logger.info(` Next: ${latest.reviewQNext3.join(\", \")}`);\n }\n logger.info(`New Queue: ${latest.newQLength} cards`);\n if (latest.newQNext3 && latest.newQNext3.length > 0) {\n logger.info(` Next: ${latest.newQNext3.join(\", \")}`);\n }\n logger.info(`Failed Queue: ${latest.failedQLength} cards`);\n console.groupEnd();\n}\nfunction showPresentationHistory(sessionIndex = 0) {\n const session = sessionIndex === 0 && activeSession ? activeSession : sessionHistory[sessionIndex];\n if (!session) {\n logger.info(`[Session Debug] No session found at index ${sessionIndex}`);\n return;\n }\n console.group(`\\u{1F4DC} Session History: ${session.sessionId}`);\n logger.info(`Started: ${session.startTime.toLocaleTimeString()}`);\n if (session.endTime) {\n logger.info(`Ended: ${session.endTime.toLocaleTimeString()}`);\n }\n logger.info(`Cards presented: ${session.presentations.length}`);\n if (session.presentations.length > 0) {\n console.table(\n session.presentations.map((p) => ({\n \"#\": p.sequenceNumber,\n course: p.courseName || p.courseId.slice(0, 8),\n origin: p.origin,\n queue: p.queueSource,\n score: p.score?.toFixed(3) || \"-\",\n time: p.timestamp.toLocaleTimeString()\n }))\n );\n }\n console.groupEnd();\n}\nfunction showInterleaving(sessionIndex = 0) {\n const session = sessionIndex === 0 && activeSession ? activeSession : sessionHistory[sessionIndex];\n if (!session) {\n logger.info(`[Session Debug] No session found at index ${sessionIndex}`);\n return;\n }\n console.group(\"\\u{1F500} Interleaving Analysis\");\n const courseCounts = /* @__PURE__ */ new Map();\n const courseOrigins = /* @__PURE__ */ new Map();\n session.presentations.forEach((p) => {\n const name = p.courseName || p.courseId;\n courseCounts.set(name, (courseCounts.get(name) || 0) + 1);\n if (!courseOrigins.has(name)) {\n courseOrigins.set(name, { review: 0, new: 0, failed: 0 });\n }\n const origins = courseOrigins.get(name);\n origins[p.origin]++;\n });\n logger.info(\"Course distribution:\");\n console.table(\n Array.from(courseCounts.entries()).map(([course, count]) => {\n const origins = courseOrigins.get(course);\n return {\n course,\n total: count,\n reviews: origins.review,\n new: origins.new,\n failed: origins.failed,\n percentage: (count / session.presentations.length * 100).toFixed(1) + \"%\"\n };\n })\n );\n if (session.presentations.length > 0) {\n logger.info(\"\\nPresentation sequence (first 20):\");\n const sequence = session.presentations.slice(0, 20).map((p, idx) => `${idx + 1}. ${p.courseName || p.courseId.slice(0, 8)} (${p.origin})`).join(\"\\n\");\n logger.info(sequence);\n }\n let maxCluster = 0;\n let currentCluster = 1;\n let currentCourse = session.presentations[0]?.courseId;\n for (let i = 1; i < session.presentations.length; i++) {\n if (session.presentations[i].courseId === currentCourse) {\n currentCluster++;\n maxCluster = Math.max(maxCluster, currentCluster);\n } else {\n currentCourse = session.presentations[i].courseId;\n currentCluster = 1;\n }\n }\n if (maxCluster > 3) {\n logger.info(`\n\\u26A0\\uFE0F Detected clustering: max ${maxCluster} cards from same course in a row`);\n logger.info(\"This suggests cards are sorted by score rather than round-robin by course.\");\n }\n console.groupEnd();\n}\nvar sessionDebugAPI = {\n /**\n * Get raw session history for programmatic access.\n */\n get sessions() {\n return [...sessionHistory];\n },\n /**\n * Get active session if any.\n */\n get active() {\n return activeSession;\n },\n /**\n * Show current queue state.\n */\n showQueue() {\n showCurrentQueue();\n },\n /**\n * Show presentation history for current or past session.\n */\n showHistory(sessionIndex = 0) {\n showPresentationHistory(sessionIndex);\n },\n /**\n * Analyze course interleaving pattern.\n */\n showInterleaving(sessionIndex = 0) {\n showInterleaving(sessionIndex);\n },\n /**\n * List all tracked sessions.\n */\n listSessions() {\n if (activeSession) {\n logger.info(`Active session: ${activeSession.sessionId} (${activeSession.presentations.length} cards presented)`);\n }\n if (sessionHistory.length === 0) {\n logger.info(\"[Session Debug] No completed sessions in history.\");\n return;\n }\n console.table(\n sessionHistory.map((s, idx) => ({\n index: idx,\n id: s.sessionId.slice(-8),\n started: s.startTime.toLocaleTimeString(),\n ended: s.endTime?.toLocaleTimeString() || \"incomplete\",\n cards: s.presentations.length\n }))\n );\n },\n /**\n * Export session history as JSON for bug reports.\n */\n export() {\n const data = {\n active: activeSession,\n history: sessionHistory\n };\n const json = JSON.stringify(data, null, 2);\n logger.info(\"[Session Debug] Session data exported. Copy the returned string or use:\");\n logger.info(\" copy(window.skuilder.session.export())\");\n return json;\n },\n /**\n * Clear session history.\n */\n clear() {\n sessionHistory.length = 0;\n logger.info(\"[Session Debug] Session history cleared.\");\n },\n /**\n * Show help.\n */\n help() {\n logger.info(`\n\\u{1F3AF} Session Debug API\n\nCommands:\n .showQueue() Show current queue state (active session only)\n .showHistory(index?) Show presentation history (0=current/last, 1=previous, etc)\n .showInterleaving(index?) Analyze course interleaving pattern\n .listSessions() List all tracked sessions\n .export() Export session data as JSON for bug reports\n .clear() Clear session history\n .sessions Access raw session history array\n .active Access active session (if any)\n .help() Show this help message\n\nExample:\n window.skuilder.session.showHistory()\n window.skuilder.session.showInterleaving()\n window.skuilder.session.showQueue()\n`);\n }\n};\nfunction mountSessionDebugger() {\n if (typeof window === \"undefined\") return;\n const win = window;\n win.skuilder = win.skuilder || {};\n win.skuilder.session = sessionDebugAPI;\n}\nmountSessionDebugger();\n\n// src/study/SessionController.ts\ninit_logger();\nvar SessionController = class _SessionController extends Loggable {\n _className = \"SessionController\";\n services;\n srsService;\n eloService;\n hydrationService;\n mixer;\n dataLayer;\n courseNameCache = /* @__PURE__ */ new Map();\n /**\n * Default pipeline batch size for new-card planning.\n * Set via constructor options; falls back to 20 when not specified.\n * Individual replans can override via `ReplanOptions.limit`.\n */\n _defaultBatchLimit = 20;\n /**\n * Maximum number of reviews enqueued at session start. Reviews live\n * outside the replan flow — the queue drains via consumption and is\n * not refilled mid-session. The session timer caps total review\n * exposure, so overfilling here is intentional. Default is generous\n * to accommodate Anki-style power users with hundreds of due reviews;\n * apps targeting nimbler sessions should override via constructor.\n */\n _initialReviewCap = 200;\n sources;\n // dataLayer and getViewComponent now injected into CardHydrationService\n _sessionRecord = [];\n set sessionRecord(r) {\n this._sessionRecord = r;\n }\n // Session card stores\n _currentCard = null;\n reviewQ = new ItemQueue();\n newQ = new ItemQueue();\n failedQ = new ItemQueue();\n // END Session card stores\n /**\n * Promise tracking a currently in-progress replan, or null if idle.\n * Used by nextCard() to await completion before drawing from queues.\n */\n _replanPromise = null;\n /**\n * Number of well-indicated new cards remaining before the queue\n * degrades to poorly-indicated content. Decremented on each newQ\n * draw; when it hits 0, a replan is triggered automatically\n * (user state has changed from completing good cards).\n */\n _wellIndicatedRemaining = 0;\n /**\n * When true, suppresses the quality-based auto-replan trigger in\n * nextCard(). Set after a burst replan (small limit) to prevent the\n * auto-replan from clobbering the burst cards before they're consumed.\n * Cleared when the depletion-triggered replan fires (newQ exhausted).\n */\n _suppressQualityReplan = false;\n /**\n * Guards against infinite depletion-triggered replans. Set to true\n * when a depletion replan fires; cleared when a replan produces\n * content (newQ.length > 0 after replan) or when an explicit\n * (non-auto) replan is requested.\n */\n _depletionReplanAttempted = false;\n /**\n * When > 0, the session timer cannot end the session. Decremented on\n * each nextCard() draw. Set by replans that include `minFollowUpCards`.\n */\n _minCardsGuarantee = 0;\n startTime;\n endTime;\n _secondsRemaining;\n get secondsRemaining() {\n return this._secondsRemaining;\n }\n /** True when a card guarantee is active, preventing timer-based session end. */\n get hasCardGuarantee() {\n return this._minCardsGuarantee > 0;\n }\n get report() {\n const reviewCount = this.reviewQ.dequeueCount;\n const newCount = this.newQ.dequeueCount;\n const reviewWord = reviewCount === 1 ? \"review\" : \"reviews\";\n const newCardWord = newCount === 1 ? \"new card\" : \"new cards\";\n return `${reviewCount} ${reviewWord}, ${newCount} ${newCardWord}`;\n }\n get detailedReport() {\n return this.newQ.toString + \"\\n\" + this.reviewQ.toString + \"\\n\" + this.failedQ.toString;\n }\n // @ts-expect-error NodeJS.Timeout type not available in browser context\n _intervalHandle;\n /**\n * @param sources - Array of content sources to mix for the session\n * @param time - Session duration in seconds\n * @param dataLayer - Data layer provider\n * @param getViewComponent - Function to resolve view components\n * @param mixer - Optional source mixer strategy (defaults to QuotaRoundRobinMixer)\n * @param options - Optional session-level configuration\n * @param options.defaultBatchLimit - Default pipeline batch size (default: 20).\n * Smaller values for newer users cause more frequent replans, keeping plans\n * aligned with rapidly-changing user state.\n * @param options.initialReviewCap - Max reviews loaded at session start (default: 200).\n * Applied only on initial planning; replans do not refill the review queue.\n */\n constructor(sources, time, dataLayer, getViewComponent, mixer, options) {\n super();\n this.dataLayer = dataLayer;\n this.mixer = mixer || new QuotaRoundRobinMixer();\n this.srsService = new SrsService(dataLayer.getUserDB());\n this.eloService = new EloService(dataLayer, dataLayer.getUserDB());\n this.hydrationService = new CardHydrationService(\n getViewComponent,\n (courseId) => dataLayer.getCourseDB(courseId),\n () => this._getItemsToHydrate()\n );\n this.services = {\n response: new ResponseProcessor(this.srsService, this.eloService)\n };\n this.sources = sources;\n this.startTime = /* @__PURE__ */ new Date();\n this._secondsRemaining = time;\n this.endTime = new Date(this.startTime.valueOf() + 1e3 * this._secondsRemaining);\n if (options?.defaultBatchLimit !== void 0) {\n this._defaultBatchLimit = options.defaultBatchLimit;\n }\n if (options?.initialReviewCap !== void 0) {\n this._initialReviewCap = options.initialReviewCap;\n }\n this.log(`Session constructed:\n startTime: ${this.startTime}\n endTime: ${this.endTime}\n defaultBatchLimit: ${this._defaultBatchLimit}\n initialReviewCap: ${this._initialReviewCap}`);\n }\n tick() {\n this._secondsRemaining = Math.floor((this.endTime.valueOf() - Date.now()) / 1e3);\n if (this._secondsRemaining <= 0) {\n clearInterval(this._intervalHandle);\n }\n }\n /**\n * Returns a rough, erring toward conservative, guess at\n * the amount of time the failed cards queue will require\n * to clean up.\n *\n * (seconds)\n */\n estimateCleanupTime() {\n let time = 0;\n for (let i = 0; i < this.failedQ.length; i++) {\n const c = this.failedQ.peek(i);\n const record = this._sessionRecord.find((r) => r.item.cardID === c.cardID);\n let cardTime = 0;\n if (record) {\n for (let j = 0; j < record.records.length; j++) {\n cardTime += record.records[j].timeSpent;\n }\n cardTime = cardTime / record.records.length;\n time += cardTime;\n }\n }\n const ret = time / 1e3;\n this.log(`Failed card cleanup estimate: ${Math.round(ret)}`);\n return ret;\n }\n /**\n * Extremely rough, conservative, estimate of amound of time to complete\n * all scheduled reviews\n */\n estimateReviewTime() {\n const ret = 5 * this.reviewQ.length;\n this.log(`Review card time estimate: ${ret}`);\n return ret;\n }\n async prepareSession() {\n if (this.sources.some((s) => typeof s.getWeightedCards !== \"function\")) {\n throw new Error(\n \"[SessionController] All content sources must implement getWeightedCards().\"\n );\n }\n const wellIndicated = await this.getWeightedContent();\n this._wellIndicatedRemaining = wellIndicated;\n if (wellIndicated >= 0 && wellIndicated < _SessionController.MIN_WELL_INDICATED) {\n this.log(\n `[Init] Only ${wellIndicated}/${_SessionController.MIN_WELL_INDICATED} well-indicated cards in initial load`\n );\n }\n await this.hydrationService.ensureHydratedCards();\n startSessionTracking(this.reviewQ.length, this.newQ.length, this.failedQ.length);\n this._intervalHandle = setInterval(() => {\n this.tick();\n }, 1e3);\n }\n /**\n * Request a mid-session replan. Re-runs the pipeline with current user state\n * and atomically replaces the newQ contents. Safe to call at any time during\n * a session — if called while a replan is already in progress, returns the\n * existing replan promise (no duplicate work).\n *\n * Does NOT affect reviewQ or failedQ.\n *\n * If nextCard() is called while a replan is in flight, it will automatically\n * await the replan before drawing from queues, ensuring the user always sees\n * cards scored against their latest state.\n *\n * Typical trigger: application-level code (e.g. after a GPC intro completion)\n * calls this to ensure newly-unlocked content appears in the session.\n */\n async requestReplan(options) {\n const opts = this.normalizeReplanOptions(options);\n if (opts.hints || opts.label || opts.limit) {\n this._depletionReplanAttempted = false;\n }\n if (this._replanPromise) {\n this.log(\"Replan already in progress, awaiting existing replan\");\n return this._replanPromise;\n }\n if (!opts.hints) opts.hints = {};\n const hints = opts.hints;\n const excludeSet = new Set(hints.excludeCards ?? []);\n if (this._currentCard?.item.cardID) {\n excludeSet.add(this._currentCard.item.cardID);\n }\n for (const rec of this._sessionRecord) {\n excludeSet.add(rec.card.card_id);\n }\n hints.excludeCards = [...excludeSet];\n if (opts.hints) {\n const hintsWithLabel = opts.label ? { ...opts.hints, _label: opts.label } : opts.hints;\n for (const source of this.sources) {\n source.setEphemeralHints?.(hintsWithLabel);\n }\n }\n const labelTag = opts.label ? ` [${opts.label}]` : \"\";\n this.log(\n `Mid-session replan requested${labelTag} (limit: ${opts.limit ?? \"default\"}, mode: ${opts.mode ?? \"replace\"}${opts.hints ? \", with hints\" : \"\"})`\n );\n if (opts.minFollowUpCards !== void 0 && opts.minFollowUpCards > 0) {\n this._minCardsGuarantee = Math.max(this._minCardsGuarantee, opts.minFollowUpCards);\n this.log(`[Replan] Card guarantee set to ${this._minCardsGuarantee}`);\n }\n this._replanPromise = this._executeReplan(opts);\n try {\n await this._replanPromise;\n } finally {\n this._replanPromise = null;\n }\n }\n /**\n * Normalise the requestReplan argument. Accepts either a ReplanOptions\n * object (new API) or a plain Record<string, unknown> (legacy callers\n * that passed hints directly). Distinguishes the two by checking for\n * the presence of ReplanOptions-specific keys.\n */\n normalizeReplanOptions(input) {\n if (!input) return {};\n const replanKeys = [\"hints\", \"limit\", \"mode\", \"label\", \"minFollowUpCards\"];\n const inputKeys = Object.keys(input);\n if (inputKeys.some((k) => replanKeys.includes(k))) {\n return input;\n }\n return { hints: input };\n }\n /** Minimum well-indicated cards before an additive retry is attempted */\n static MIN_WELL_INDICATED = 5;\n /**\n * Score threshold for considering a card \"well-indicated.\"\n * Cards below this score are treated as fallback filler — present only\n * because no strategy hard-removed them, but likely penalized by one\n * or more filters. Strategy-agnostic: the SessionController doesn't\n * know or care which strategy assigned the score.\n */\n static WELL_INDICATED_SCORE = 0.1;\n /**\n * Internal replan execution. Runs the pipeline, builds a new newQ,\n * atomically swaps it in, and triggers hydration for the new contents.\n *\n * If the initial replan produces fewer than MIN_WELL_INDICATED cards that\n * pass all hierarchy filters, one additive retry is attempted — merging\n * any new high-quality candidates into the front of the queue.\n */\n async _executeReplan(opts = {}) {\n const limit = opts.limit;\n const mode = opts.mode ?? \"replace\";\n const wellIndicated = await this.getWeightedContent({\n replan: true,\n additive: mode === \"merge\",\n limit\n });\n this._wellIndicatedRemaining = wellIndicated;\n if (limit !== void 0 && limit < this._defaultBatchLimit) {\n this._suppressQualityReplan = true;\n this.log(`[Replan] Burst mode (limit=${limit}): suppressing quality-based auto-replan`);\n } else {\n this._suppressQualityReplan = false;\n }\n if (wellIndicated >= 0 && wellIndicated < _SessionController.MIN_WELL_INDICATED) {\n this.log(\n `[Replan] Only ${wellIndicated}/${_SessionController.MIN_WELL_INDICATED} well-indicated cards after replan`\n );\n }\n if (this.newQ.length > 0) {\n this._depletionReplanAttempted = false;\n }\n await this.hydrationService.ensureHydratedCards();\n const labelTag = opts.label ? ` [${opts.label}]` : \"\";\n this.log(`Replan complete${labelTag}: newQ now has ${this.newQ.length} cards (mode=${mode})`);\n snapshotQueues(this.reviewQ.length, this.newQ.length, this.failedQ.length);\n }\n addTime(seconds) {\n this.endTime = new Date(this.endTime.valueOf() + 1e3 * seconds);\n }\n get failedCount() {\n return this.failedQ.length;\n }\n toString() {\n return `Session: ${this.reviewQ.length} Reviews, ${this.newQ.length} New, ${this.failedQ.length} failed`;\n }\n reportString() {\n return `${this.reviewQ.dequeueCount} Reviews, ${this.newQ.dequeueCount} New, ${this.failedQ.dequeueCount} failed`;\n }\n /**\n * Returns debug information about the current session state.\n * Used by SessionControllerDebug component for runtime inspection.\n */\n getDebugInfo() {\n const supportsWeightedCards = this.sources.some(\n (s) => typeof s.getWeightedCards === \"function\"\n );\n const extractQueueItems = (queue, limit = 10) => {\n const items = [];\n for (let i = 0; i < Math.min(queue.length, limit); i++) {\n const item = queue.peek(i);\n items.push({\n courseID: item.courseID || \"unknown\",\n cardID: item.cardID || \"unknown\",\n status: item.status || \"unknown\"\n });\n }\n return items;\n };\n return {\n api: {\n mode: supportsWeightedCards ? \"weighted\" : \"legacy\",\n description: supportsWeightedCards ? \"Using getWeightedCards() API with scored candidates\" : \"ERROR: getWeightedCards() not a function.\"\n },\n reviewQueue: {\n length: this.reviewQ.length,\n dequeueCount: this.reviewQ.dequeueCount,\n items: extractQueueItems(this.reviewQ)\n },\n newQueue: {\n length: this.newQ.length,\n dequeueCount: this.newQ.dequeueCount,\n items: extractQueueItems(this.newQ)\n },\n failedQueue: {\n length: this.failedQ.length,\n dequeueCount: this.failedQ.dequeueCount,\n items: extractQueueItems(this.failedQ)\n },\n hydratedCache: {\n count: this.hydrationService.hydratedCount,\n cardIds: this.hydrationService.getHydratedCardIds()\n },\n replan: {\n inProgress: this._replanPromise !== null,\n suppressQualityReplan: this._suppressQualityReplan,\n defaultBatchLimit: this._defaultBatchLimit,\n minCardsGuarantee: this._minCardsGuarantee\n }\n };\n }\n /**\n * Fetch content using the getWeightedCards API and mix across sources.\n *\n * This method:\n * 1. Fetches weighted cards from each source\n * 2. Fetches full review data (we need ScheduledCard fields for queue)\n * 3. Uses SourceMixer to balance content across sources\n * 4. Populates review and new card queues with mixed results\n */\n /**\n * Fetch weighted content from all sources and populate session queues.\n *\n * @param options.replan - If true, this is a mid-session replan rather than\n * initial session setup. Skips review queue population (avoiding duplicates),\n * atomically replaces newQ contents, and treats empty results as non-fatal.\n * @param options.additive - If true (replan only), merge new high-quality\n * candidates into the front of the existing newQ instead of replacing it.\n * @returns Number of \"well-indicated\" cards (passed all hierarchy filters)\n * in the new content. Returns -1 if no content was loaded.\n */\n async getWeightedContent(options) {\n const replan = options?.replan ?? false;\n const additive = options?.additive ?? false;\n const newLimit = options?.limit ?? this._defaultBatchLimit;\n const fetchLimit = replan ? newLimit : newLimit + this._initialReviewCap;\n const batches = [];\n for (let i = 0; i < this.sources.length; i++) {\n const source = this.sources[i];\n try {\n const weighted = (await source.getWeightedCards(fetchLimit)).cards;\n batches.push({\n sourceIndex: i,\n weighted\n });\n } catch (error) {\n this.error(`Failed to get content from source ${i}:`, error);\n if (this.sources.length === 1) {\n throw new Error(`Cannot start session: failed to load content from source ${i}`);\n }\n }\n }\n if (batches.length === 0) {\n if (replan) {\n this.log(\"Replan: no content from any source, keeping existing newQ\");\n return -1;\n }\n throw new Error(\n `Cannot start session: failed to load content from all ${this.sources.length} source(s). Check logs for details.`\n );\n }\n const mixedWeighted = this.mixer.mix(batches, fetchLimit * this.sources.length);\n const sourceIds = batches.map((b) => {\n const firstCard = b.weighted[0];\n return firstCard?.courseId || `source-${b.sourceIndex}`;\n });\n await Promise.all(\n sourceIds.map(async (id) => {\n if (!this.courseNameCache.has(id)) {\n try {\n const config = await this.dataLayer.getCoursesDB().getCourseConfig(id);\n this.courseNameCache.set(id, config.name);\n } catch {\n }\n }\n })\n );\n const sourceNames = sourceIds.map((id) => this.courseNameCache.get(id));\n const quotaPerSource = this.mixer instanceof QuotaRoundRobinMixer ? Math.ceil(fetchLimit * this.sources.length / batches.length) : void 0;\n captureMixerRun(\n this.mixer.constructor.name,\n batches,\n sourceIds,\n sourceNames,\n fetchLimit * this.sources.length,\n quotaPerSource,\n mixedWeighted\n );\n const reviewWeighted = mixedWeighted.filter((w) => getCardOrigin(w) === \"review\").slice(0, this._initialReviewCap);\n const newWeighted = mixedWeighted.filter((w) => getCardOrigin(w) === \"new\").slice(0, newLimit);\n logger.debug(`[reviews] got ${reviewWeighted.length} reviews from mixer`);\n let report = replan ? \"Replan content:\\n\" : \"Mixed content session created with:\\n\";\n if (!replan) {\n for (const w of reviewWeighted) {\n const reviewItem = {\n cardID: w.cardId,\n courseID: w.courseId,\n contentSourceType: \"course\",\n contentSourceID: w.courseId,\n reviewID: w.reviewID,\n status: \"review\"\n };\n this.reviewQ.add(reviewItem, reviewItem.cardID);\n report += `Review: ${w.courseId}::${w.cardId} (score: ${w.score.toFixed(2)})\n`;\n }\n }\n const wellIndicated = newWeighted.filter(\n (w) => w.score >= _SessionController.WELL_INDICATED_SCORE\n ).length;\n const newItems = [];\n for (const w of newWeighted) {\n const newItem = {\n cardID: w.cardId,\n courseID: w.courseId,\n contentSourceType: \"course\",\n contentSourceID: w.courseId,\n status: \"new\"\n };\n newItems.push(newItem);\n report += `New: ${w.courseId}::${w.cardId} (score: ${w.score.toFixed(2)})\n`;\n }\n if (additive) {\n const added = this.newQ.mergeToFront(newItems, (item) => item.cardID);\n report += `Additive merge: ${added} new cards added to front of newQ\n`;\n } else if (replan) {\n this.newQ.replaceAll(newItems, (item) => item.cardID);\n } else {\n for (const item of newItems) {\n this.newQ.add(item, item.cardID);\n }\n }\n this.log(report);\n return wellIndicated;\n }\n /**\n * Returns items that should be pre-hydrated.\n * Deterministic: top N items from each queue to ensure coverage.\n * Failed queue items will typically already be hydrated (from initial render).\n */\n _getItemsToHydrate() {\n const items = [];\n const ITEMS_PER_QUEUE = 2;\n for (let i = 0; i < Math.min(ITEMS_PER_QUEUE, this.reviewQ.length); i++) {\n items.push(this.reviewQ.peek(i));\n }\n for (let i = 0; i < Math.min(ITEMS_PER_QUEUE, this.newQ.length); i++) {\n items.push(this.newQ.peek(i));\n }\n for (let i = 0; i < Math.min(ITEMS_PER_QUEUE, this.failedQ.length); i++) {\n items.push(this.failedQ.peek(i));\n }\n return items;\n }\n /**\n * Selects the next item to present to the user.\n * Nondeterministic: uses probability to balance between queues based on session state.\n */\n _selectNextItemToHydrate() {\n const choice = Math.random();\n let newBound = 0.1;\n let reviewBound = 0.75;\n if (this.reviewQ.length === 0 && this.failedQ.length === 0 && this.newQ.length === 0) {\n return null;\n }\n if (this._secondsRemaining < 2 && this.failedQ.length === 0 && this._minCardsGuarantee <= 0) {\n return null;\n }\n if (this._secondsRemaining <= 0 && this._minCardsGuarantee <= 0) {\n if (this.failedQ.length > 0) {\n return this.failedQ.peek(0);\n } else {\n return null;\n }\n }\n if (this.newQ.dequeueCount < this.sources.length && this.newQ.length) {\n return this.newQ.peek(0);\n }\n const cleanupTime = this.estimateCleanupTime();\n const reviewTime = this.estimateReviewTime();\n const availableTime = this._secondsRemaining - (cleanupTime + reviewTime);\n if (availableTime > 20) {\n newBound = 0.5;\n reviewBound = 0.9;\n } else if (this._secondsRemaining - cleanupTime > 20) {\n newBound = 0.05;\n reviewBound = 0.9;\n } else {\n newBound = 0.01;\n reviewBound = 0.1;\n }\n if (this.failedQ.length === 0) {\n reviewBound = 1;\n }\n if (this.reviewQ.length === 0) {\n newBound = reviewBound;\n }\n if (choice < newBound && this.newQ.length) {\n return this.newQ.peek(0);\n } else if (choice < reviewBound && this.reviewQ.length) {\n return this.reviewQ.peek(0);\n } else if (this.failedQ.length) {\n return this.failedQ.peek(0);\n } else {\n this.log(`No more cards available for the session!`);\n return null;\n }\n }\n async nextCard(action = \"dismiss-success\") {\n this.dismissCurrentCard(action);\n if (this._minCardsGuarantee > 0) {\n this._minCardsGuarantee--;\n this.log(`[CardGuarantee] ${this._minCardsGuarantee} guaranteed cards remaining`);\n }\n if (this._replanPromise) {\n this.log(\"nextCard: awaiting in-flight replan before drawing\");\n await this._replanPromise;\n }\n if (this.newQ.length <= 1 && this._secondsRemaining > 0 && !this._replanPromise && !this._depletionReplanAttempted) {\n this._suppressQualityReplan = false;\n this._depletionReplanAttempted = true;\n const otherContent = this.reviewQ.length + this.failedQ.length;\n if (this.newQ.length === 0 && otherContent === 0) {\n this.log(\n `[AutoReplan:depletion] All queues empty with ${this._secondsRemaining}s remaining. Awaiting replan.`\n );\n await this.requestReplan();\n } else {\n this.log(\n `[AutoReplan:depletion] newQ has ${this.newQ.length} card(s) (${otherContent} in other queues) with ${this._secondsRemaining}s remaining. Triggering background replan.`\n );\n void this.requestReplan();\n }\n }\n const REPLAN_BUFFER = 3;\n if (!this._suppressQualityReplan && this._wellIndicatedRemaining <= REPLAN_BUFFER && this.newQ.length > 0 && !this._replanPromise) {\n this.log(\n `[AutoReplan:quality] ${this._wellIndicatedRemaining} well-indicated cards remaining (newQ: ${this.newQ.length}). Triggering background replan.`\n );\n void this.requestReplan();\n }\n if (this._secondsRemaining <= 0 && this.failedQ.length === 0 && this._minCardsGuarantee <= 0) {\n this._currentCard = null;\n endSessionTracking();\n return null;\n }\n const MAX_SKIP = 20;\n for (let attempt = 0; attempt < MAX_SKIP; attempt++) {\n const nextItem = this._selectNextItemToHydrate();\n if (!nextItem) {\n this._currentCard = null;\n endSessionTracking();\n return null;\n }\n let card = this.hydrationService.getHydratedCard(nextItem.cardID);\n if (!card) {\n card = await this.hydrationService.waitForCard(nextItem.cardID);\n }\n this.removeItemFromQueue(nextItem);\n if (card) {\n await this.hydrationService.ensureHydratedCards();\n this._currentCard = card;\n const origin = nextItem.status === \"review\" || nextItem.status === \"failed-review\" ? \"review\" : nextItem.status === \"new\" || nextItem.status === \"failed-new\" ? \"new\" : \"failed\";\n const queueSource = nextItem.status.startsWith(\"failed\") ? \"failedQ\" : nextItem.status === \"review\" ? \"reviewQ\" : \"newQ\";\n recordCardPresentation(\n nextItem.cardID,\n nextItem.courseID,\n this.courseNameCache.get(nextItem.courseID),\n origin,\n queueSource\n );\n snapshotQueues(this.reviewQ.length, this.newQ.length, this.failedQ.length);\n return card;\n }\n this.log(`Skipping card ${nextItem.cardID}: hydration failed, trying next`);\n if (isReview(nextItem)) {\n this.srsService.removeReview(nextItem.reviewID);\n }\n }\n this.log(`Exhausted ${MAX_SKIP} skip attempts finding a hydratable card`);\n this._currentCard = null;\n endSessionTracking();\n return null;\n }\n /**\n * Public API for processing user responses to cards.\n * @param cardRecord User's response record\n * @param cardHistory Promise resolving to the card's history\n * @param courseRegistrationDoc User's course registration document\n * @param currentCard Current study session record\n * @param courseId Course identifier\n * @param cardId Card identifier\n * @param maxAttemptsPerView Maximum attempts allowed per view\n * @param maxSessionViews Maximum session views for this card\n * @param sessionViews Current number of session views\n * @returns ResponseResult with navigation and UI instructions\n */\n async submitResponse(cardRecord, cardHistory, courseRegistrationDoc, currentCard, courseId, cardId, maxAttemptsPerView, maxSessionViews, sessionViews) {\n const studySessionItem = {\n ...currentCard.item\n };\n return await this.services.response.processResponse(\n cardRecord,\n cardHistory,\n studySessionItem,\n courseRegistrationDoc,\n currentCard,\n courseId,\n cardId,\n maxAttemptsPerView,\n maxSessionViews,\n sessionViews\n );\n }\n dismissCurrentCard(action = \"dismiss-success\") {\n if (this._currentCard) {\n if (action === \"dismiss-success\") {\n this.hydrationService.removeCard(this._currentCard.item.cardID);\n } else if (action === \"marked-failed\") {\n let failedItem;\n if (isReview(this._currentCard.item)) {\n failedItem = {\n cardID: this._currentCard.item.cardID,\n courseID: this._currentCard.item.courseID,\n contentSourceID: this._currentCard.item.contentSourceID,\n contentSourceType: this._currentCard.item.contentSourceType,\n status: \"failed-review\",\n reviewID: this._currentCard.item.reviewID\n };\n } else {\n failedItem = {\n cardID: this._currentCard.item.cardID,\n courseID: this._currentCard.item.courseID,\n contentSourceID: this._currentCard.item.contentSourceID,\n contentSourceType: this._currentCard.item.contentSourceType,\n status: \"failed-new\"\n };\n }\n this.failedQ.add(failedItem, failedItem.cardID);\n } else if (action === \"dismiss-error\") {\n this.hydrationService.removeCard(this._currentCard.item.cardID);\n } else if (action === \"dismiss-failed\") {\n this.hydrationService.removeCard(this._currentCard.item.cardID);\n }\n }\n }\n /**\n * Remove an item from its source queue after consumption by nextCard().\n */\n removeItemFromQueue(item) {\n if (this.reviewQ.peek(0)?.cardID === item.cardID) {\n this.reviewQ.dequeue((queueItem) => queueItem.cardID);\n } else if (this.newQ.peek(0)?.cardID === item.cardID) {\n this.newQ.dequeue((queueItem) => queueItem.cardID);\n if (this._wellIndicatedRemaining > 0) {\n this._wellIndicatedRemaining--;\n }\n } else if (this.failedQ.peek(0)?.cardID === item.cardID) {\n this.failedQ.dequeue((queueItem) => queueItem.cardID);\n }\n }\n /**\n * End the session and record learning outcomes.\n *\n * This method aggregates all responses from the session and records a\n * UserOutcomeRecord if evolutionary orchestration is enabled.\n */\n async endSession() {\n if (!this._sessionRecord || this._sessionRecord.length === 0) {\n return;\n }\n const questionRecords = this._sessionRecord.flatMap((r) => r.records).filter((r) => r.userAnswer !== void 0);\n if (questionRecords.length === 0) {\n return;\n }\n let orchestrationContext = null;\n const strategies = [];\n for (const source of this.sources) {\n if (source.getOrchestrationContext) {\n try {\n orchestrationContext = await source.getOrchestrationContext();\n if (source.getStrategyIds) {\n strategies.push(...source.getStrategyIds());\n }\n } catch (e) {\n logger.warn(`[SessionController] Failed to get orchestration context: ${e}`);\n }\n if (orchestrationContext) break;\n }\n }\n if (!orchestrationContext) {\n logger.debug(\"[SessionController] No orchestration context available, skipping outcome recording\");\n return;\n }\n const periodEnd = (/* @__PURE__ */ new Date()).toISOString();\n const periodStart = new Date(this.startTime).toISOString();\n await recordUserOutcome(\n orchestrationContext,\n periodStart,\n periodEnd,\n questionRecords,\n strategies\n );\n }\n};\n\n// src/study/index.ts\ninit_TagFilteredContentSource();\n\n// src/index.ts\ninit_factory();\nexport {\n ContentNavigator,\n CouchDBToStaticPacker,\n CourseLookup,\n DocType,\n DocTypePrefixes,\n ENV,\n FileSystemError,\n GuestUsername,\n Loggable,\n NOT_SET,\n NavigatorRole,\n NavigatorRoles,\n Navigators,\n QuotaRoundRobinMixer,\n SessionController,\n StaticToCouchDBMigrator,\n TagFilteredContentSource,\n _resetDataLayer,\n aggregateOutcomesForGradient,\n areQuestionRecords,\n buildStrategyStateId,\n captureMixerRun,\n computeDeviation,\n computeEffectiveWeight,\n computeOutcomeSignal,\n computeSpread,\n computeStrategyGradient,\n createOrchestrationContext,\n docIsDeleted,\n endSessionTracking,\n ensureAppDataDirectory,\n getAppDataDirectory,\n getCardHistoryID,\n getCardOrigin,\n getDataLayer,\n getDbPath,\n getDefaultLearnableWeight,\n getRegisteredNavigator,\n getRegisteredNavigatorNames,\n getRegisteredNavigatorRole,\n getStudySource,\n hasRegisteredNavigator,\n importParsedCards,\n initializeDataDirectory,\n initializeDataLayer,\n initializeNavigatorRegistry,\n isDataShapeRegistered,\n isDataShapeSchemaAvailable,\n isFilter,\n isGenerator,\n isQuestionRecord,\n isQuestionTypeRegistered,\n isReview,\n log,\n mixerDebugAPI,\n mountMixerDebugger,\n mountPipelineDebugger,\n mountSessionDebugger,\n mountUserDBDebugger,\n newInterval,\n parseCardHistoryID,\n pipelineDebugAPI,\n processCustomQuestionsData,\n recordCardPresentation,\n recordUserOutcome,\n registerBlanksCard,\n registerCustomQuestionTypes,\n registerDataShape,\n registerNavigator,\n registerQuestionType,\n registerSeedData,\n removeCustomQuestionTypes,\n removeDataShape,\n removeQuestionType,\n runPeriodUpdate,\n scoreAccuracyInZone,\n sessionDebugAPI,\n snapshotQueues,\n startSessionTracking,\n updateLearningState,\n updateStrategyWeight,\n userDBDebugAPI,\n validateMigration,\n validateProcessorConfig,\n validateStaticCourse\n};\n//# sourceMappingURL=index.mjs.map"],"x_google_ignoreList":[0,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],"mappings":"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"}