hide-a-bed 5.2.7 → 6.0.0-beta.0

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 (363) hide show
  1. package/.prettierrc +7 -0
  2. package/README.md +270 -218
  3. package/dist/cjs/index.cjs +1952 -0
  4. package/dist/esm/index.mjs +1898 -0
  5. package/docs/.nojekyll +1 -0
  6. package/docs/assets/hierarchy.js +1 -0
  7. package/docs/assets/highlight.css +113 -0
  8. package/docs/assets/icons.js +18 -0
  9. package/docs/assets/icons.svg +1 -0
  10. package/docs/assets/main.js +60 -0
  11. package/docs/assets/navigation.js +1 -0
  12. package/docs/assets/search.js +1 -0
  13. package/docs/assets/style.css +1633 -0
  14. package/docs/classes/QueryBuilder.html +42 -0
  15. package/docs/functions/bindConfig.html +4 -0
  16. package/docs/functions/bulkGet.html +14 -0
  17. package/docs/functions/bulkGetDictionary.html +10 -0
  18. package/docs/functions/bulkRemove.html +12 -0
  19. package/docs/functions/bulkRemoveMap.html +11 -0
  20. package/docs/functions/bulkSave.html +10 -0
  21. package/docs/functions/bulkSaveTransaction.html +23 -0
  22. package/docs/functions/createLock.html +7 -0
  23. package/docs/functions/createQuery.html +1 -0
  24. package/docs/functions/get.html +1 -0
  25. package/docs/functions/getAtRev.html +1 -0
  26. package/docs/functions/getDBInfo.html +10 -0
  27. package/docs/functions/patch.html +8 -0
  28. package/docs/functions/patchDangerously.html +9 -0
  29. package/docs/functions/put.html +1 -0
  30. package/docs/functions/query.html +15 -0
  31. package/docs/functions/queryStream.html +6 -0
  32. package/docs/functions/remove.html +1 -0
  33. package/docs/functions/removeLock.html +6 -0
  34. package/docs/functions/watchDocs.html +9 -0
  35. package/docs/functions/withRetry.html +6 -0
  36. package/docs/hierarchy.html +1 -0
  37. package/docs/index.html +483 -0
  38. package/docs/interfaces/NetworkError.html +6 -0
  39. package/docs/interfaces/NotFoundError.html +10 -0
  40. package/docs/interfaces/RetryOptions.html +10 -0
  41. package/docs/interfaces/RetryableError.html +10 -0
  42. package/docs/interfaces/StandardSchemaV1.FailureResult.html +4 -0
  43. package/docs/interfaces/StandardSchemaV1.Issue.html +6 -0
  44. package/docs/interfaces/StandardSchemaV1.Options.html +3 -0
  45. package/docs/interfaces/StandardSchemaV1.PathSegment.html +4 -0
  46. package/docs/interfaces/StandardSchemaV1.Props.html +10 -0
  47. package/docs/interfaces/StandardSchemaV1.SuccessResult.html +6 -0
  48. package/docs/interfaces/StandardSchemaV1.Types.html +6 -0
  49. package/docs/interfaces/StandardSchemaV1.html +4 -0
  50. package/docs/modules/StandardSchemaV1.html +1 -0
  51. package/docs/modules.html +1 -0
  52. package/docs/types/BoundInstance.html +1 -0
  53. package/docs/types/BulkGetBound.html +2 -0
  54. package/docs/types/BulkGetDictionaryBound.html +1 -0
  55. package/docs/types/BulkGetDictionaryOptions.html +2 -0
  56. package/docs/types/BulkGetDictionaryResult.html +3 -0
  57. package/docs/types/BulkGetOptions.html +3 -0
  58. package/docs/types/BulkGetResponse.html +1 -0
  59. package/docs/types/CouchConfig-1.html +1 -0
  60. package/docs/types/CouchConfig.html +1 -0
  61. package/docs/types/CouchConfigInput.html +1 -0
  62. package/docs/types/CouchDoc-1.html +1 -0
  63. package/docs/types/CouchDoc.html +2 -0
  64. package/docs/types/CouchDocInput.html +2 -0
  65. package/docs/types/GetAtRevBound.html +1 -0
  66. package/docs/types/GetBound.html +1 -0
  67. package/docs/types/GetOptions.html +2 -0
  68. package/docs/types/LockDoc-1.html +1 -0
  69. package/docs/types/LockDoc.html +1 -0
  70. package/docs/types/LockOptions-1.html +1 -0
  71. package/docs/types/LockOptions.html +1 -0
  72. package/docs/types/LockOptionsInput.html +1 -0
  73. package/docs/types/OnInvalidDocAction.html +1 -0
  74. package/docs/types/OnRow.html +1 -0
  75. package/docs/types/QueryBound.html +1 -0
  76. package/docs/types/SimpleViewOptions-1.html +1 -0
  77. package/docs/types/SimpleViewOptions.html +1 -0
  78. package/docs/types/StandardSchemaV1.InferInput.html +2 -0
  79. package/docs/types/StandardSchemaV1.InferOutput.html +2 -0
  80. package/docs/types/StandardSchemaV1.Result.html +2 -0
  81. package/docs/types/ViewQueryResponse-1.html +1 -0
  82. package/docs/types/ViewQueryResponse.html +2 -0
  83. package/docs/types/ViewQueryResponseValidated.html +2 -0
  84. package/docs/types/ViewRow-1.html +1 -0
  85. package/docs/types/ViewRow.html +2 -0
  86. package/docs/types/ViewRowValidated.html +7 -0
  87. package/docs/types/ViewString.html +1 -0
  88. package/docs/types/WatchOptionsInput.html +1 -0
  89. package/docs/types/WatchOptionsSchema-1.html +1 -0
  90. package/docs/types/WatchOptionsSchema.html +1 -0
  91. package/eslint.config.js +15 -0
  92. package/impl/bindConfig.mts +140 -0
  93. package/impl/bulkGet.mts +256 -0
  94. package/impl/bulkGet.test.mts +159 -0
  95. package/impl/bulkRemove.mts +98 -0
  96. package/impl/bulkRemove.test.mts +102 -0
  97. package/impl/bulkSave.mts +286 -0
  98. package/impl/bulkSave.test.mts +319 -0
  99. package/impl/get.mts +137 -0
  100. package/impl/get.test.mts +114 -0
  101. package/impl/getDBInfo.mts +67 -0
  102. package/impl/getDBInfo.test.mts +62 -0
  103. package/impl/patch.mts +134 -0
  104. package/impl/patch.test.mts +142 -0
  105. package/impl/put.mts +56 -0
  106. package/impl/put.test.mts +114 -0
  107. package/impl/query.mts +224 -0
  108. package/impl/query.test.mts +280 -0
  109. package/impl/remove.mts +65 -0
  110. package/impl/remove.test.mts +82 -0
  111. package/impl/retry.mts +66 -0
  112. package/impl/retry.test.mts +77 -0
  113. package/impl/stream.mts +143 -0
  114. package/impl/stream.test.mts +205 -0
  115. package/impl/sugar/lock.mts +103 -0
  116. package/impl/sugar/lock.test.mts +113 -0
  117. package/impl/sugar/{watch.mjs → watch.mts} +56 -22
  118. package/impl/sugar/watch.test.mts +155 -0
  119. package/impl/utils/errors.mts +130 -0
  120. package/impl/utils/errors.test.mts +58 -0
  121. package/impl/utils/logger.mts +62 -0
  122. package/impl/utils/logger.test.mts +129 -0
  123. package/impl/utils/mergeNeedleOpts.mts +16 -0
  124. package/impl/utils/parseRows.mts +117 -0
  125. package/impl/utils/parseRows.test.mts +183 -0
  126. package/impl/utils/queryBuilder.mts +173 -0
  127. package/impl/utils/queryBuilder.test.mts +83 -0
  128. package/impl/utils/queryString.mts +44 -0
  129. package/impl/utils/queryString.test.mts +53 -0
  130. package/impl/{trackedEmitter.mjs → utils/trackedEmitter.mts} +9 -7
  131. package/impl/utils/transactionErrors.mts +71 -0
  132. package/index.mts +82 -0
  133. package/index.test.mts +415 -0
  134. package/package.json +45 -31
  135. package/schema/config.mts +81 -0
  136. package/schema/couch/couch.input.schema.ts +43 -0
  137. package/schema/couch/couch.output.schema.ts +169 -0
  138. package/schema/sugar/lock.mts +18 -0
  139. package/schema/sugar/watch.mts +14 -0
  140. package/schema/util.mts +8 -0
  141. package/tsconfig.json +10 -4
  142. package/tsdown.config.ts +16 -0
  143. package/typedoc.json +4 -0
  144. package/types/output/eslint.config.d.ts +3 -0
  145. package/types/output/eslint.config.d.ts.map +1 -0
  146. package/types/output/impl/bindConfig.d.mts +174 -0
  147. package/types/output/impl/bindConfig.d.mts.map +1 -0
  148. package/types/output/impl/bulkGet.d.mts +75 -0
  149. package/types/output/impl/bulkGet.d.mts.map +1 -0
  150. package/types/output/impl/bulkGet.test.d.mts +2 -0
  151. package/types/output/impl/bulkGet.test.d.mts.map +1 -0
  152. package/types/output/impl/bulkRemove.d.mts +63 -0
  153. package/types/output/impl/bulkRemove.d.mts.map +1 -0
  154. package/types/output/impl/bulkRemove.test.d.mts +2 -0
  155. package/types/output/impl/bulkRemove.test.d.mts.map +1 -0
  156. package/types/output/impl/bulkSave.d.mts +64 -0
  157. package/types/output/impl/bulkSave.d.mts.map +1 -0
  158. package/types/output/impl/bulkSave.test.d.mts +2 -0
  159. package/types/output/impl/bulkSave.test.d.mts.map +1 -0
  160. package/types/output/impl/get.d.mts +20 -0
  161. package/types/output/impl/get.d.mts.map +1 -0
  162. package/types/output/impl/get.test.d.mts +2 -0
  163. package/types/output/impl/get.test.d.mts.map +1 -0
  164. package/types/output/impl/getDBInfo.d.mts +52 -0
  165. package/types/output/impl/getDBInfo.d.mts.map +1 -0
  166. package/types/output/impl/getDBInfo.test.d.mts +2 -0
  167. package/types/output/impl/getDBInfo.test.d.mts.map +1 -0
  168. package/types/output/impl/patch.d.mts +45 -0
  169. package/types/output/impl/patch.d.mts.map +1 -0
  170. package/types/output/impl/patch.test.d.mts +2 -0
  171. package/types/output/impl/patch.test.d.mts.map +1 -0
  172. package/types/output/impl/put.d.mts +5 -0
  173. package/types/output/impl/put.d.mts.map +1 -0
  174. package/types/output/impl/put.test.d.mts +2 -0
  175. package/types/output/impl/put.test.d.mts.map +1 -0
  176. package/types/output/impl/query.d.mts +47 -0
  177. package/types/output/impl/query.d.mts.map +1 -0
  178. package/types/output/impl/query.test.d.mts +2 -0
  179. package/types/output/impl/query.test.d.mts.map +1 -0
  180. package/types/output/impl/remove.d.mts +9 -0
  181. package/types/output/impl/remove.d.mts.map +1 -0
  182. package/types/output/impl/remove.test.d.mts +2 -0
  183. package/types/output/impl/remove.test.d.mts.map +1 -0
  184. package/types/output/impl/retry.d.mts +32 -0
  185. package/types/output/impl/retry.d.mts.map +1 -0
  186. package/types/output/impl/retry.test.d.mts +2 -0
  187. package/types/output/impl/retry.test.d.mts.map +1 -0
  188. package/types/output/impl/stream.d.mts +13 -0
  189. package/types/output/impl/stream.d.mts.map +1 -0
  190. package/types/output/impl/stream.test.d.mts +2 -0
  191. package/types/output/impl/stream.test.d.mts.map +1 -0
  192. package/types/output/impl/sugar/lock.d.mts +24 -0
  193. package/types/output/impl/sugar/lock.d.mts.map +1 -0
  194. package/types/output/impl/sugar/lock.test.d.mts +2 -0
  195. package/types/output/impl/sugar/lock.test.d.mts.map +1 -0
  196. package/types/output/impl/sugar/watch.d.mts +21 -0
  197. package/types/output/impl/sugar/watch.d.mts.map +1 -0
  198. package/types/output/impl/sugar/watch.test.d.mts +2 -0
  199. package/types/output/impl/sugar/watch.test.d.mts.map +1 -0
  200. package/types/output/impl/utils/errors.d.mts +78 -0
  201. package/types/output/impl/utils/errors.d.mts.map +1 -0
  202. package/types/output/impl/utils/errors.test.d.mts +2 -0
  203. package/types/output/impl/utils/errors.test.d.mts.map +1 -0
  204. package/types/output/impl/utils/logger.d.mts +11 -0
  205. package/types/output/impl/utils/logger.d.mts.map +1 -0
  206. package/types/output/impl/utils/logger.test.d.mts +2 -0
  207. package/types/output/impl/utils/logger.test.d.mts.map +1 -0
  208. package/types/output/impl/utils/mergeNeedleOpts.d.mts +53 -0
  209. package/types/output/impl/utils/mergeNeedleOpts.d.mts.map +1 -0
  210. package/types/output/impl/utils/parseRows.d.mts +15 -0
  211. package/types/output/impl/utils/parseRows.d.mts.map +1 -0
  212. package/types/output/impl/utils/parseRows.test.d.mts +2 -0
  213. package/types/output/impl/utils/parseRows.test.d.mts.map +1 -0
  214. package/types/output/impl/utils/queryBuilder.d.mts +68 -0
  215. package/types/output/impl/utils/queryBuilder.d.mts.map +1 -0
  216. package/types/output/impl/utils/queryBuilder.test.d.mts +2 -0
  217. package/types/output/impl/utils/queryBuilder.test.d.mts.map +1 -0
  218. package/types/output/impl/utils/queryString.d.mts +9 -0
  219. package/types/output/impl/utils/queryString.d.mts.map +1 -0
  220. package/types/output/impl/utils/queryString.test.d.mts +2 -0
  221. package/types/output/impl/utils/queryString.test.d.mts.map +1 -0
  222. package/types/output/impl/utils/trackedEmitter.d.mts +7 -0
  223. package/types/output/impl/utils/trackedEmitter.d.mts.map +1 -0
  224. package/{impl → types/output/impl/utils}/transactionErrors.d.mts +16 -31
  225. package/types/output/impl/utils/transactionErrors.d.mts.map +1 -0
  226. package/types/output/index.d.mts +32 -0
  227. package/types/output/index.d.mts.map +1 -0
  228. package/types/output/index.test.d.mts +2 -0
  229. package/types/output/index.test.d.mts.map +1 -0
  230. package/types/output/schema/config.d.mts +90 -0
  231. package/types/output/schema/config.d.mts.map +1 -0
  232. package/types/output/schema/couch/couch.input.schema.d.ts +29 -0
  233. package/types/output/schema/couch/couch.input.schema.d.ts.map +1 -0
  234. package/types/output/schema/couch/couch.output.schema.d.ts +113 -0
  235. package/types/output/schema/couch/couch.output.schema.d.ts.map +1 -0
  236. package/types/output/schema/sugar/lock.d.mts +19 -0
  237. package/types/output/schema/sugar/lock.d.mts.map +1 -0
  238. package/types/output/schema/sugar/watch.d.mts +11 -0
  239. package/types/output/schema/sugar/watch.d.mts.map +1 -0
  240. package/types/output/schema/util.d.mts +85 -0
  241. package/types/output/schema/util.d.mts.map +1 -0
  242. package/types/output/tsdown.config.d.ts +3 -0
  243. package/types/output/tsdown.config.d.ts.map +1 -0
  244. package/types/output/types/standard-schema.d.ts +60 -0
  245. package/types/output/types/standard-schema.d.ts.map +1 -0
  246. package/types/standard-schema.ts +76 -0
  247. package/types/utils.d.ts +1 -0
  248. package/cjs/impl/bulk.cjs +0 -275
  249. package/cjs/impl/changes.cjs +0 -67
  250. package/cjs/impl/crud.cjs +0 -127
  251. package/cjs/impl/errors.cjs +0 -75
  252. package/cjs/impl/logger.cjs +0 -70
  253. package/cjs/impl/patch.cjs +0 -95
  254. package/cjs/impl/query.cjs +0 -116
  255. package/cjs/impl/queryBuilder.cjs +0 -163
  256. package/cjs/impl/retry.cjs +0 -55
  257. package/cjs/impl/stream.cjs +0 -121
  258. package/cjs/impl/sugar/lock.cjs +0 -81
  259. package/cjs/impl/sugar/watch.cjs +0 -159
  260. package/cjs/impl/trackedEmitter.cjs +0 -54
  261. package/cjs/impl/transactionErrors.cjs +0 -70
  262. package/cjs/impl/util.cjs +0 -64
  263. package/cjs/index.cjs +0 -132
  264. package/cjs/integration/changes.cjs +0 -76
  265. package/cjs/integration/disconnect-watch.cjs +0 -52
  266. package/cjs/integration/watch.cjs +0 -59
  267. package/cjs/schema/bind.cjs +0 -59
  268. package/cjs/schema/bulk.cjs +0 -92
  269. package/cjs/schema/changes.cjs +0 -68
  270. package/cjs/schema/config.cjs +0 -48
  271. package/cjs/schema/crud.cjs +0 -77
  272. package/cjs/schema/patch.cjs +0 -53
  273. package/cjs/schema/query.cjs +0 -62
  274. package/cjs/schema/stream.cjs +0 -42
  275. package/cjs/schema/sugar/lock.cjs +0 -59
  276. package/cjs/schema/sugar/watch.cjs +0 -42
  277. package/cjs/schema/util.cjs +0 -39
  278. package/config.json +0 -5
  279. package/docs/compiler.png +0 -0
  280. package/dualmode.config.json +0 -11
  281. package/impl/bulk.d.mts +0 -11
  282. package/impl/bulk.d.mts.map +0 -1
  283. package/impl/bulk.mjs +0 -291
  284. package/impl/changes.d.mts +0 -12
  285. package/impl/changes.d.mts.map +0 -1
  286. package/impl/changes.mjs +0 -53
  287. package/impl/crud.d.mts +0 -7
  288. package/impl/crud.d.mts.map +0 -1
  289. package/impl/crud.mjs +0 -108
  290. package/impl/errors.d.mts +0 -43
  291. package/impl/errors.d.mts.map +0 -1
  292. package/impl/errors.mjs +0 -65
  293. package/impl/logger.d.mts +0 -32
  294. package/impl/logger.d.mts.map +0 -1
  295. package/impl/logger.mjs +0 -59
  296. package/impl/patch.d.mts +0 -6
  297. package/impl/patch.d.mts.map +0 -1
  298. package/impl/patch.mjs +0 -88
  299. package/impl/query.d.mts +0 -195
  300. package/impl/query.d.mts.map +0 -1
  301. package/impl/query.mjs +0 -122
  302. package/impl/queryBuilder.d.mts +0 -154
  303. package/impl/queryBuilder.d.mts.map +0 -1
  304. package/impl/queryBuilder.mjs +0 -175
  305. package/impl/retry.d.mts +0 -2
  306. package/impl/retry.d.mts.map +0 -1
  307. package/impl/retry.mjs +0 -39
  308. package/impl/stream.d.mts +0 -3
  309. package/impl/stream.d.mts.map +0 -1
  310. package/impl/stream.mjs +0 -98
  311. package/impl/sugar/lock.d.mts +0 -5
  312. package/impl/sugar/lock.d.mts.map +0 -1
  313. package/impl/sugar/lock.mjs +0 -70
  314. package/impl/sugar/watch.d.mts +0 -34
  315. package/impl/sugar/watch.d.mts.map +0 -1
  316. package/impl/trackedEmitter.d.mts +0 -8
  317. package/impl/trackedEmitter.d.mts.map +0 -1
  318. package/impl/transactionErrors.d.mts.map +0 -1
  319. package/impl/transactionErrors.mjs +0 -47
  320. package/impl/util.d.mts +0 -3
  321. package/impl/util.d.mts.map +0 -1
  322. package/impl/util.mjs +0 -35
  323. package/index.d.mts +0 -80
  324. package/index.d.mts.map +0 -1
  325. package/index.mjs +0 -141
  326. package/integration/changes.mjs +0 -60
  327. package/integration/disconnect-watch.mjs +0 -36
  328. package/integration/watch.mjs +0 -40
  329. package/log.txt +0 -580
  330. package/schema/bind.d.mts +0 -5461
  331. package/schema/bind.d.mts.map +0 -1
  332. package/schema/bind.mjs +0 -43
  333. package/schema/bulk.d.mts +0 -923
  334. package/schema/bulk.d.mts.map +0 -1
  335. package/schema/bulk.mjs +0 -83
  336. package/schema/changes.d.mts +0 -191
  337. package/schema/changes.d.mts.map +0 -1
  338. package/schema/changes.mjs +0 -59
  339. package/schema/config.d.mts +0 -79
  340. package/schema/config.d.mts.map +0 -1
  341. package/schema/config.mjs +0 -26
  342. package/schema/crud.d.mts +0 -491
  343. package/schema/crud.d.mts.map +0 -1
  344. package/schema/crud.mjs +0 -64
  345. package/schema/patch.d.mts +0 -255
  346. package/schema/patch.d.mts.map +0 -1
  347. package/schema/patch.mjs +0 -42
  348. package/schema/query.d.mts +0 -406
  349. package/schema/query.d.mts.map +0 -1
  350. package/schema/query.mjs +0 -45
  351. package/schema/stream.d.mts +0 -211
  352. package/schema/stream.d.mts.map +0 -1
  353. package/schema/stream.mjs +0 -23
  354. package/schema/sugar/lock.d.mts +0 -238
  355. package/schema/sugar/lock.d.mts.map +0 -1
  356. package/schema/sugar/lock.mjs +0 -50
  357. package/schema/sugar/watch.d.mts +0 -127
  358. package/schema/sugar/watch.d.mts.map +0 -1
  359. package/schema/sugar/watch.mjs +0 -29
  360. package/schema/util.d.mts +0 -160
  361. package/schema/util.d.mts.map +0 -1
  362. package/schema/util.mjs +0 -35
  363. package/types/changes-stream.d.ts +0 -11
@@ -0,0 +1,483 @@
1
+ <!DOCTYPE html><html class="default" lang="en" data-base="./"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>@brivity/hide-a-bed</title><meta name="description" content="Documentation for @brivity/hide-a-bed"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="assets/style.css"/><link rel="stylesheet" href="assets/highlight.css"/><script defer src="assets/main.js"></script><script async src="assets/icons.js" id="tsd-icons-script"></script><script async src="assets/search.js" id="tsd-search-script"></script><script async src="assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="index.html" class="title">@brivity/hide-a-bed</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><h1>@brivity/hide-a-bed</h1></div><div class="tsd-panel tsd-typography"><h3 id="api-quick-reference" class="tsd-anchor-link">API Quick Reference<a href="#api-quick-reference" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><p>🍭 denotes a <em>Sugar</em> API - helps make some tasks sweet and easy, but may hide some complexities you might want to deal with.</p>
2
+ <table>
3
+ <thead>
4
+ <tr>
5
+ <th>Document Operations</th>
6
+ <th>Bulk Operations</th>
7
+ <th>View Operations</th>
8
+ <th>Change Utilities</th>
9
+ </tr>
10
+ </thead>
11
+ <tbody>
12
+ <tr>
13
+ <td><a href="#get"><code>get()</code></a></td>
14
+ <td><a href="#bulkget"><code>bulkGet()</code></a></td>
15
+ <td><a href="#query"><code>query()</code></a></td>
16
+ <td><a href="#watchdocs"><code>watchDocs()</code></a> 🍭</td>
17
+ </tr>
18
+ <tr>
19
+ <td><a href="#put"><code>put()</code></a></td>
20
+ <td><a href="#bulksave"><code>bulkSave()</code></a></td>
21
+ <td><a href="#querystream"><code>queryStream()</code></a></td>
22
+ <td><a href="#changes-feed-companion">Standalone changes feed</a></td>
23
+ </tr>
24
+ <tr>
25
+ <td><a href="#patch"><code>patch()</code></a> 🍭</td>
26
+ <td><a href="#bulkremove"><code>bulkRemove()</code></a></td>
27
+ <td><a href="#remove"><code>remove()</code></a></td>
28
+ <td></td>
29
+ </tr>
30
+ <tr>
31
+ <td><a href="#patchdangerously"><code>patchDangerously()</code></a> 🍭</td>
32
+ <td><a href="#bulkremovemap"><code>bulkRemoveMap()</code></a></td>
33
+ <td></td>
34
+ <td></td>
35
+ </tr>
36
+ <tr>
37
+ <td><a href="#getatrev"><code>getAtRev()</code></a> 🍭</td>
38
+ <td><a href="#bulkgetdictionary"><code>bulkGetDictionary()</code></a> 🍭</td>
39
+ <td></td>
40
+ <td></td>
41
+ </tr>
42
+ <tr>
43
+ <td><a href="#createlock"><code>createLock()</code></a> 🍭</td>
44
+ <td><a href="#bulksavetransaction"><code>bulkSaveTransaction()</code></a> 🍭</td>
45
+ <td></td>
46
+ <td></td>
47
+ </tr>
48
+ <tr>
49
+ <td><a href="#removelock"><code>removeLock()</code></a> 🍭</td>
50
+ <td></td>
51
+ <td></td>
52
+ <td></td>
53
+ </tr>
54
+ </tbody>
55
+ </table>
56
+ <p>And some utility APIs</p>
57
+ <ul>
58
+ <li><a href="#getdbinfo"><code>getDBInfo()</code></a></li>
59
+ <li><a href="#createquery"><code>createQuery()</code></a> 🍭</li>
60
+ <li><a href="#withretry"><code>withRetry()</code></a></li>
61
+ </ul>
62
+ <h3 id="setup" class="tsd-anchor-link">Setup<a href="#setup" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><p>Depending on your environment, use import or require</p>
63
+ <pre><code><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">get</span><span class="hl-1">, </span><span class="hl-2">put</span><span class="hl-1">, </span><span class="hl-2">query</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&#39;hide-a-bed&#39;</span>
64
+ </code><button>Copy</button></pre>
65
+
66
+ <p>or</p>
67
+ <pre><code><span class="hl-4">const</span><span class="hl-1"> { </span><span class="hl-5">get</span><span class="hl-1">, </span><span class="hl-5">put</span><span class="hl-1">, </span><span class="hl-5">query</span><span class="hl-1"> } = </span><span class="hl-6">require</span><span class="hl-1">(</span><span class="hl-3">&#39;hide-a-bed&#39;</span><span class="hl-1">)</span>
68
+ </code><button>Copy</button></pre>
69
+
70
+ <h3 id="config" class="tsd-anchor-link">Config<a href="#config" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><p>Anywhere you see a config, it is an object with the following setup
71
+ <code>{ couch: 'https://username:pass@the.couch.url.com:5984' }</code>
72
+ And it is passed in as the first argument of all the functions
73
+ <code>const doc = await get(config, 'doc-123')</code></p>
74
+ <p>See <a href="#advanced-config-options">Advanced Config Options</a> for more advanced settings.</p>
75
+ <h4 id="bindconfig" class="tsd-anchor-link">bindConfig<a href="#bindconfig" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>bindConfig function is a convenience method to bind the config, so you don't need to pass it in every call.
76
+ Usually, you label the variable returned db so method calls appear to operate on the bound db.</p>
77
+ <pre><code><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">bindConfig</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&#39;hide-a-bed&#39;</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">db</span><span class="hl-1"> = </span><span class="hl-6">bindConfig</span><span class="hl-1">(</span><span class="hl-2">process</span><span class="hl-1">.</span><span class="hl-2">env</span><span class="hl-1">)</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">services</span><span class="hl-1"> = { </span><span class="hl-2">db</span><span class="hl-1"> } </span><span class="hl-7">// see example below</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">doc</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">db</span><span class="hl-1">.</span><span class="hl-6">get</span><span class="hl-1">(</span><span class="hl-3">&#39;doc-123&#39;</span><span class="hl-1">)</span>
78
+ </code><button>Copy</button></pre>
79
+
80
+ <h5 id="config-overrides" class="tsd-anchor-link">Config Overrides<a href="#config-overrides" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h5><p>You also can quickly override (or more) config settings for a particular call using db.options(optionOverrides)</p>
81
+ <p>e.g.</p>
82
+ <pre><code><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">db</span><span class="hl-1"> = </span><span class="hl-6">bindConfig</span><span class="hl-1">({ </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/db&#39;</span><span class="hl-1">, </span><span class="hl-2">throwOnGetNotFound:</span><span class="hl-1"> </span><span class="hl-4">false</span><span class="hl-1"> })</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">doc</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">db</span><span class="hl-1">.</span><span class="hl-6">options</span><span class="hl-1">({ </span><span class="hl-2">throwOnGetNotFound:</span><span class="hl-1"> </span><span class="hl-4">true</span><span class="hl-1"> }).</span><span class="hl-6">get</span><span class="hl-1">(</span><span class="hl-3">&#39;doc-id&#39;</span><span class="hl-1">)</span>
83
+ </code><button>Copy</button></pre>
84
+
85
+ <p>You can pass any of <a href="#advanced-config-options">Config Options</a> to db.options to override the original config bindings.</p>
86
+ <h3 id="document-operations" class="tsd-anchor-link">Document Operations<a href="#document-operations" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><h4 id="get" class="tsd-anchor-link">get<a href="#get" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Get a single document by ID.</p>
87
+ <p><strong>Parameters:</strong></p>
88
+ <ul>
89
+ <li><code>config</code>: Object with
90
+ <ul>
91
+ <li><code>couch</code> URL string</li>
92
+ <li><code>throwOnGetNotFound</code> default false. If true, 404 docs throw</li>
93
+ </ul>
94
+ </li>
95
+ <li><code>id</code>: Document ID string</li>
96
+ <li>Returns: Promise resolving to document object or null if not found</li>
97
+ </ul>
98
+ <pre><code class="javascript"><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = { </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1"> }</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">doc</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">get</span><span class="hl-1">(</span><span class="hl-2">config</span><span class="hl-1">, </span><span class="hl-3">&#39;doc-123&#39;</span><span class="hl-1">)</span><br/><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">log</span><span class="hl-1">(</span><span class="hl-2">doc</span><span class="hl-1">.</span><span class="hl-2">_id</span><span class="hl-1">, </span><span class="hl-2">doc</span><span class="hl-1">.</span><span class="hl-2">_rev</span><span class="hl-1">)</span><br/><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">notFound</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">get</span><span class="hl-1">(</span><span class="hl-2">config</span><span class="hl-1">, </span><span class="hl-3">&#39;notFound&#39;</span><span class="hl-1">)</span><br/><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">log</span><span class="hl-1">(</span><span class="hl-2">notFound</span><span class="hl-1">) </span><span class="hl-7">// null</span><br/><br/><span class="hl-0">try</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">throwOnGetNotFound:</span><span class="hl-1"> </span><span class="hl-4">true</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">get</span><span class="hl-1">(</span><span class="hl-2">config</span><span class="hl-1">, </span><span class="hl-3">&#39;notFound&#39;</span><span class="hl-1">)</span><br/><span class="hl-1">} </span><span class="hl-0">catch</span><span class="hl-1"> (</span><span class="hl-2">err</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-0">if</span><span class="hl-1"> (</span><span class="hl-2">err</span><span class="hl-1">.</span><span class="hl-2">name</span><span class="hl-1"> === </span><span class="hl-3">&#39;NotFoundError&#39;</span><span class="hl-1">) </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">log</span><span class="hl-1">(</span><span class="hl-3">&#39;Document not found&#39;</span><span class="hl-1">)</span><br/><span class="hl-1">}</span>
99
+ </code><button type="button">Copy</button></pre>
100
+
101
+ <h4 id="put" class="tsd-anchor-link">put<a href="#put" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Save a document.</p>
102
+ <p><strong>Parameters:</strong></p>
103
+ <ul>
104
+ <li><code>config</code>: Object with <code>couch</code> URL string</li>
105
+ <li><code>doc</code>: Document object with <code>_id</code> property</li>
106
+ <li>Returns: Promise resolving to response with <code>ok</code>, <code>id</code>, <code>rev</code> properties, eg: { ok: boolean, id: string, rev: string }</li>
107
+ </ul>
108
+ <pre><code class="javascript"><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = { </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1"> }</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">doc</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">_id:</span><span class="hl-1"> </span><span class="hl-3">&#39;doc-123&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">type:</span><span class="hl-1"> </span><span class="hl-3">&#39;user&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">name:</span><span class="hl-1"> </span><span class="hl-3">&#39;Alice&#39;</span><br/><span class="hl-1">}</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">result</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">put</span><span class="hl-1">(</span><span class="hl-2">config</span><span class="hl-1">, </span><span class="hl-2">doc</span><span class="hl-1">)</span><br/><span class="hl-7">// result: { ok: true, id: &#39;doc-123&#39;, rev: &#39;1-abc123&#39; }</span><br/><br/><span class="hl-7">// imaginary rev returns a conflict</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">doc</span><span class="hl-1"> = { </span><span class="hl-2">_id:</span><span class="hl-1"> </span><span class="hl-3">&#39;notThereDoc&#39;</span><span class="hl-1">, </span><span class="hl-2">_rev:</span><span class="hl-1"> </span><span class="hl-3">&#39;32-does-not-compute&#39;</span><span class="hl-1"> }</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">result2</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">db</span><span class="hl-1">.</span><span class="hl-6">put</span><span class="hl-1">(</span><span class="hl-2">doc</span><span class="hl-1">)</span><br/><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">log</span><span class="hl-1">(</span><span class="hl-2">result2</span><span class="hl-1">) </span><span class="hl-7">// { ok: false, error: &#39;conflict&#39;, statusCode: 409 }</span>
109
+ </code><button type="button">Copy</button></pre>
110
+
111
+ <h4 id="patch" class="tsd-anchor-link">patch<a href="#patch" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>The patch function lets you update specific properties of a document. The _rev value must be set, and passed in with properties.</p>
112
+ <p><strong>Parameters:</strong></p>
113
+ <ul>
114
+ <li><code>config</code>: Object with couch URL string</li>
115
+ <li><code>id</code>: Document ID string</li>
116
+ <li><code>properties</code>: Object with properties to update, must include _rev property</li>
117
+ <li>Returns: Promise resolving to response with <code>ok</code>, <code>id</code>, <code>rev</code> properties</li>
118
+ </ul>
119
+ <pre><code class="javascript"><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">retries:</span><span class="hl-1"> </span><span class="hl-8">3</span><br/><span class="hl-1">}</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">properties</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">_rev:</span><span class="hl-1"> </span><span class="hl-3">&#39;3-fdskjhfsdkjhfsd&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">name:</span><span class="hl-1"> </span><span class="hl-3">&#39;Alice Smith&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">updated:</span><span class="hl-1"> </span><span class="hl-4">true</span><br/><span class="hl-1">}</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">result</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">patch</span><span class="hl-1">(</span><span class="hl-2">config</span><span class="hl-1">, </span><span class="hl-3">&#39;doc-123&#39;</span><span class="hl-1">, </span><span class="hl-2">properties</span><span class="hl-1">)</span><br/><span class="hl-7">// result: { ok: true, id: &#39;doc-123&#39;, rev: &#39;2-xyz789&#39; }</span>
120
+ </code><button type="button">Copy</button></pre>
121
+
122
+ <h4 id="patchdangerously" class="tsd-anchor-link">patchDangerously<a href="#patchdangerously" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Update specific properties of a document, no _rev is needed.</p>
123
+ <p><strong>Parameters:</strong></p>
124
+ <ul>
125
+ <li><code>config</code>: Object with couch URL string</li>
126
+ <li><code>id</code>: Document ID string</li>
127
+ <li><code>properties</code>: Object with properties to update</li>
128
+ </ul>
129
+ <p><em>Warning</em>: patchDangerously can clobber data. It will retry even if a conflict happens. There are some use cases for this, but you have been warned, hence the name.</p>
130
+ <ul>
131
+ <li><code>id</code>: Document ID string</li>
132
+ <li><code>properties</code>: Object with properties to update</li>
133
+ <li>Returns: Promise resolving to response with <code>ok</code>, <code>id</code>, <code>rev</code> properties</li>
134
+ </ul>
135
+ <pre><code class="javascript"><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">retries:</span><span class="hl-1"> </span><span class="hl-8">3</span><br/><span class="hl-1">}</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">properties</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">name:</span><span class="hl-1"> </span><span class="hl-3">&#39;Alice Smith&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">updated:</span><span class="hl-1"> </span><span class="hl-4">true</span><br/><span class="hl-1">}</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">result</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">patchDangerously</span><span class="hl-1">(</span><span class="hl-2">config</span><span class="hl-1">, </span><span class="hl-3">&#39;doc-123&#39;</span><span class="hl-1">, </span><span class="hl-2">properties</span><span class="hl-1">)</span><br/><span class="hl-7">// result: { ok: true, id: &#39;doc-123&#39;, rev: &#39;2-xyz789&#39; }</span>
136
+ </code><button type="button">Copy</button></pre>
137
+
138
+ <h4 id="getatrev" class="tsd-anchor-link">getAtRev<a href="#getatrev" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Return a document at the rev specified.</p>
139
+ <p><strong>Parameters:</strong></p>
140
+ <ul>
141
+ <li><code>config</code>: Object with couch URL string</li>
142
+ <li><code>id</code>: Document ID string</li>
143
+ <li><code>rev</code>: Revision string to retrieve</li>
144
+ </ul>
145
+ <p><em>CouchDB</em> is not a version control db. This is a special function for unique situations. The _rev might not be around as couch cleans up old revs.</p>
146
+ <pre><code class="javascript"><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = { </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1"> }</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">doc</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">getAtRev</span><span class="hl-1">(</span><span class="hl-2">config</span><span class="hl-1">, </span><span class="hl-3">&#39;doc-123&#39;</span><span class="hl-1">, </span><span class="hl-3">&#39;2-fsdjfsdakljfsajlksd&#39;</span><span class="hl-1">)</span><br/><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">log</span><span class="hl-1">(</span><span class="hl-2">doc</span><span class="hl-1">.</span><span class="hl-2">_id</span><span class="hl-1">, </span><span class="hl-2">doc</span><span class="hl-1">.</span><span class="hl-2">_rev</span><span class="hl-1">)</span>
147
+ </code><button type="button">Copy</button></pre>
148
+
149
+ <h4 id="createlock" class="tsd-anchor-link">createLock<a href="#createlock" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Create a lock document to try and prevent concurrent modifications.</p>
150
+ <p>Note this does not internally lock the document that is referenced by the id. People can still mutate it with
151
+ all the other document mutation functions. This should just be used at an app level to coordinate access
152
+ on long running document editing.</p>
153
+ <p><strong>Parameters:</strong></p>
154
+ <ul>
155
+ <li><code>config</code>: Object with <code>couch</code> URL string</li>
156
+ <li><code>docId</code>: Document ID string to lock</li>
157
+ <li><code>options</code>: Lock options object:
158
+ <ul>
159
+ <li><code>enableLocking</code>: Boolean to enable/disable locking (default: true)</li>
160
+ <li><code>username</code>: String identifying who created the lock</li>
161
+ </ul>
162
+ </li>
163
+ </ul>
164
+ <p>Returns a Promise resolving to boolean indicating if lock was created successfully.</p>
165
+ <h4 id="removelock" class="tsd-anchor-link">removeLock<a href="#removelock" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Remove a lock from a document.</p>
166
+ <p><strong>Parameters:</strong></p>
167
+ <ul>
168
+ <li><code>config</code>: Object with <code>couch</code> URL string</li>
169
+ <li><code>docId</code>: Document ID string to unlock</li>
170
+ <li><code>options</code>: Lock options object:
171
+ <ul>
172
+ <li><code>enableLocking</code>: Boolean to enable/disable locking (default: true)</li>
173
+ <li><code>username</code>: String identifying who is removing the lock</li>
174
+ </ul>
175
+ </li>
176
+ </ul>
177
+ <p>Only the user who created the lock can remove it.</p>
178
+ <pre><code class="javascript"><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = { </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1"> }</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">options</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">enableLocking:</span><span class="hl-1"> </span><span class="hl-4">true</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">username:</span><span class="hl-1"> </span><span class="hl-3">&#39;alice&#39;</span><br/><span class="hl-1">}</span><br/><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">locked</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">createLock</span><span class="hl-1">(</span><span class="hl-2">config</span><span class="hl-1">, </span><span class="hl-3">&#39;doc-123&#39;</span><span class="hl-1">, </span><span class="hl-2">options</span><span class="hl-1">)</span><br/><span class="hl-0">if</span><span class="hl-1"> (</span><span class="hl-2">locked</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-7">// Document is now locked for exclusive access</span><br/><span class="hl-1"> </span><span class="hl-7">// Perform your updates here</span><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">removeLock</span><span class="hl-1">(</span><span class="hl-2">config</span><span class="hl-1">, </span><span class="hl-3">&#39;doc-123&#39;</span><span class="hl-1">, </span><span class="hl-2">options</span><span class="hl-1">)</span><br/><span class="hl-1">}</span><br/><span class="hl-7">// Lock is now removed if it existed and was owned by &#39;alice&#39;</span>
179
+ </code><button type="button">Copy</button></pre>
180
+
181
+ <h3 id="bulk-operations" class="tsd-anchor-link">Bulk Operations<a href="#bulk-operations" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><h4 id="bulksave" class="tsd-anchor-link">bulkSave<a href="#bulksave" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Save multiple documents in one request.</p>
182
+ <p><strong>Parameters:</strong></p>
183
+ <ul>
184
+ <li><code>config</code>: Object with <code>couch</code> URL string</li>
185
+ <li><code>docs</code>: Array of document objects, each with <code>_id</code></li>
186
+ <li>Returns: Promise resolving to array of results with <code>ok</code>, <code>id</code>, <code>rev</code> for each doc</li>
187
+ </ul>
188
+ <pre><code class="javascript"><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = { </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1"> }</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">docs</span><span class="hl-1"> = [</span><br/><span class="hl-1"> { </span><span class="hl-2">_id:</span><span class="hl-1"> </span><span class="hl-3">&#39;doc1&#39;</span><span class="hl-1">, </span><span class="hl-2">type:</span><span class="hl-1"> </span><span class="hl-3">&#39;user&#39;</span><span class="hl-1">, </span><span class="hl-2">name:</span><span class="hl-1"> </span><span class="hl-3">&#39;Alice&#39;</span><span class="hl-1"> },</span><br/><span class="hl-1"> { </span><span class="hl-2">_id:</span><span class="hl-1"> </span><span class="hl-3">&#39;doc2&#39;</span><span class="hl-1">, </span><span class="hl-2">type:</span><span class="hl-1"> </span><span class="hl-3">&#39;user&#39;</span><span class="hl-1">, </span><span class="hl-2">name:</span><span class="hl-1"> </span><span class="hl-3">&#39;Bob&#39;</span><span class="hl-1"> }</span><br/><span class="hl-1">]</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">results</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">bulkSave</span><span class="hl-1">(</span><span class="hl-2">config</span><span class="hl-1">, </span><span class="hl-2">docs</span><span class="hl-1">)</span><br/><span class="hl-7">// [</span><br/><span class="hl-7">// { ok: true, id: &#39;doc1&#39;, rev: &#39;1-abc123&#39; },</span><br/><span class="hl-7">// { ok: true, id: &#39;doc2&#39;, rev: &#39;1-def456&#39; }</span><br/><span class="hl-7">// ]</span>
189
+ </code><button type="button">Copy</button></pre>
190
+
191
+ <h4 id="bulkget" class="tsd-anchor-link">bulkGet<a href="#bulkget" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Get multiple documents by ID.</p>
192
+ <p><strong>Parameters:</strong></p>
193
+ <ul>
194
+ <li><code>config</code>: Object with <code>couch</code> URL string</li>
195
+ <li><code>ids</code>: Array of document ID strings</li>
196
+ <li><code>options</code> <em>(optional)</em>:
197
+ <ul>
198
+ <li><code>validate.docSchema</code>: zod v4 schema applied to each found document before returning.</li>
199
+ </ul>
200
+ </li>
201
+ <li>Returns: Promise resolving to the optionally validated bulk response</li>
202
+ </ul>
203
+ <p>Warning: documents that are not found will still have a row in the results. The doc property will be null, and the error property will be set.</p>
204
+ <pre><code class="javascript"><span class="hl-0">import</span><span class="hl-1"> </span><span class="hl-2">z</span><span class="hl-1"> </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&#39;zod&#39;</span><br/><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = { </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1"> }</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">ids</span><span class="hl-1"> = [</span><span class="hl-3">&#39;doc1&#39;</span><span class="hl-1">, </span><span class="hl-3">&#39;doc2&#39;</span><span class="hl-1">, </span><span class="hl-3">&#39;doesNotExist&#39;</span><span class="hl-1">]</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">docs</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">bulkGet</span><span class="hl-1">(</span><span class="hl-2">config</span><span class="hl-1">, </span><span class="hl-2">ids</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-2">docSchema:</span><span class="hl-1"> </span><span class="hl-2">z</span><span class="hl-1">.</span><span class="hl-6">looseObject</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-2">_id:</span><span class="hl-1"> </span><span class="hl-2">z</span><span class="hl-1">.</span><span class="hl-6">string</span><span class="hl-1">(),</span><br/><span class="hl-1"> </span><span class="hl-2">type:</span><span class="hl-1"> </span><span class="hl-2">z</span><span class="hl-1">.</span><span class="hl-6">string</span><span class="hl-1">(),</span><br/><span class="hl-1"> </span><span class="hl-2">name:</span><span class="hl-1"> </span><span class="hl-2">z</span><span class="hl-1">.</span><span class="hl-6">string</span><span class="hl-1">()</span><br/><span class="hl-1"> })</span><br/><span class="hl-1">})</span><br/><span class="hl-7">// rows: [</span><br/><span class="hl-7">// { id: &#39;doc1&#39;, doc: { _id: &#39;doc1&#39;, type: &#39;user&#39;, name: &#39;Alice&#39; } },</span><br/><span class="hl-7">// { id: &#39;doc2&#39;, doc: { _id: &#39;doc2&#39;, type: &#39;user&#39;, name: &#39;Bob&#39; } },</span><br/><span class="hl-7">// { key: &#39;doesNotExist&#39;, error: &#39;not_found&#39; }</span><br/><span class="hl-7">// ]</span>
205
+ </code><button type="button">Copy</button></pre>
206
+
207
+ <h4 id="bulkremove" class="tsd-anchor-link">bulkRemove<a href="#bulkremove" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Delete multiple documents in one request.</p>
208
+ <p><strong>Parameters:</strong></p>
209
+ <ul>
210
+ <li><code>config</code>: Object with <code>couch</code> URL string</li>
211
+ <li><code>ids</code>: Array of document ID strings to delete</li>
212
+ <li>Returns: Promise resolving to array of results with <code>ok</code>, <code>id</code>, <code>rev</code> for each deletion</li>
213
+ </ul>
214
+ <pre><code class="javascript"><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = { </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1"> }</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">ids</span><span class="hl-1"> = [</span><span class="hl-3">&#39;doc1&#39;</span><span class="hl-1">, </span><span class="hl-3">&#39;doc2&#39;</span><span class="hl-1">]</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">results</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">bulkRemove</span><span class="hl-1">(</span><span class="hl-2">config</span><span class="hl-1">, </span><span class="hl-2">ids</span><span class="hl-1">)</span><br/><span class="hl-7">// results: [</span><br/><span class="hl-7">// { ok: true, id: &#39;doc1&#39;, rev: &#39;2-ghi789&#39; },</span><br/><span class="hl-7">// { ok: true, id: &#39;doc2&#39;, rev: &#39;2-jkl012&#39; }</span><br/><span class="hl-7">// ]</span>
215
+ </code><button type="button">Copy</button></pre>
216
+
217
+ <h4 id="remove" class="tsd-anchor-link">remove<a href="#remove" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Delete document from DB with id and rev.</p>
218
+ <p>Allows more efficient deletion of document by providing only id and rev. This is useful for deleting documents that are large, or have a lot of data.</p>
219
+ <p><strong>Parameters:</strong></p>
220
+ <ul>
221
+ <li><code>config</code>: Object with <code>couch</code> URL string</li>
222
+ <li><code>id</code>: document ID to delete</li>
223
+ <li><code>rev</code>: rev of the document to delete</li>
224
+ <li>Returns: Promise resolving to array of results with <code>ok</code>, <code>id</code>, <code>rev</code> for the deletion</li>
225
+ </ul>
226
+ <pre><code class="javascript"><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = { </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1"> }</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">id</span><span class="hl-1"> = </span><span class="hl-3">&#39;doc1&#39;</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">rev</span><span class="hl-1"> = </span><span class="hl-3">&#39;2-ghi789&#39;</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">results</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">remove</span><span class="hl-1">(</span><span class="hl-2">config</span><span class="hl-1">, </span><span class="hl-2">id</span><span class="hl-1">, </span><span class="hl-2">rev</span><span class="hl-1">)</span><br/><span class="hl-7">// result:</span><br/><span class="hl-7">// { ok: true, id: &#39;doc1&#39;, rev: &#39;2-ghi789&#39; }</span>
227
+ </code><button type="button">Copy</button></pre>
228
+
229
+ <h4 id="bulkremovemap" class="tsd-anchor-link">bulkRemoveMap<a href="#bulkremovemap" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Delete multiple documents in one request. Same inputs and outputs as <a href="#bulkremove">bulkRemove</a>, but internally the logic will handle one document at a time instead of using couch bulk operations. Useful for working with documents that have large data requirements (1MB or more).</p>
230
+ <p><strong>Parameters:</strong></p>
231
+ <ul>
232
+ <li><code>config</code>: Object with <code>couch</code> URL string</li>
233
+ <li><code>ids</code>: Array of document ID strings to delete</li>
234
+ <li>Returns: Promise resolving to array of results with <code>ok</code>, <code>id</code>, <code>rev</code> for each deletion</li>
235
+ </ul>
236
+ <pre><code class="javascript"><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = { </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1"> }</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">ids</span><span class="hl-1"> = [</span><span class="hl-3">&#39;doc1&#39;</span><span class="hl-1">, </span><span class="hl-3">&#39;doc2&#39;</span><span class="hl-1">]</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">results</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">bulkRemoveMap</span><span class="hl-1">(</span><span class="hl-2">config</span><span class="hl-1">, </span><span class="hl-2">ids</span><span class="hl-1">)</span><br/><span class="hl-7">// results: [</span><br/><span class="hl-7">// { ok: true, id: &#39;doc1&#39;, rev: &#39;2-ghi789&#39; },</span><br/><span class="hl-7">// { ok: true, id: &#39;doc2&#39;, rev: &#39;2-jkl012&#39; }</span><br/><span class="hl-7">// ]</span>
237
+ </code><button type="button">Copy</button></pre>
238
+
239
+ <h4 id="bulkgetdictionary" class="tsd-anchor-link">bulkGetDictionary<a href="#bulkgetdictionary" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Adds convenience to bulkGet. Organizes found and notFound documents into properties that are {id:result}. This makes it easy to deal with the results.</p>
240
+ <p><strong>Parameters:</strong></p>
241
+ <ul>
242
+ <li><code>config</code>: Object with <code>couch</code> URL string</li>
243
+ <li><code>ids</code>: Array of document ID strings to get</li>
244
+ <li><code>options</code> <em>(optional)</em>:
245
+ <ul>
246
+ <li><code>validate.docSchema</code>: zod v4 schema applied to each found document before returning.</li>
247
+ </ul>
248
+ </li>
249
+ <li>Returns: Promise resolving to an object with found and notFound properties.</li>
250
+ </ul>
251
+ <p><em>found</em> looks like</p>
252
+ <pre><code><span class="hl-1">{</span><br/><span class="hl-1"> </span><span class="hl-9">doc1</span><span class="hl-1">: { </span><span class="hl-9">_id</span><span class="hl-1">: </span><span class="hl-3">&#39;doc1&#39;</span><span class="hl-1">, </span><span class="hl-9">_rev</span><span class="hl-1">: </span><span class="hl-3">&#39;1-221&#39;</span><span class="hl-1">, </span><span class="hl-9">data</span><span class="hl-1">: {} },</span><br/><span class="hl-1"> </span><span class="hl-9">doc2</span><span class="hl-1">: { </span><span class="hl-9">_id</span><span class="hl-1">: </span><span class="hl-3">&#39;doc2&#39;</span><span class="hl-1">, </span><span class="hl-9">_rev</span><span class="hl-1">: </span><span class="hl-3">&#39;4-421&#39;</span><span class="hl-1">, </span><span class="hl-9">data</span><span class="hl-1">: {} },</span><br/><span class="hl-1">}</span>
253
+ </code><button>Copy</button></pre>
254
+
255
+ <p><em>notFound</em> looks like</p>
256
+ <pre><code><span class="hl-1">{</span><br/><span class="hl-1"> </span><span class="hl-9">doesNotExist</span><span class="hl-1">: { </span><span class="hl-9">key</span><span class="hl-1">: </span><span class="hl-3">&#39;doesNotExist&#39;</span><span class="hl-1">, </span><span class="hl-9">error</span><span class="hl-1">: </span><span class="hl-3">&#39;not_found&#39;</span><span class="hl-1"> }</span><br/><span class="hl-1">}</span>
257
+ </code><button>Copy</button></pre>
258
+
259
+ <pre><code class="javascript"><span class="hl-0">import</span><span class="hl-1"> </span><span class="hl-2">z</span><span class="hl-1"> </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&#39;zod&#39;</span><br/><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = { </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1"> }</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">ids</span><span class="hl-1"> = [</span><span class="hl-3">&#39;doc1&#39;</span><span class="hl-1">, </span><span class="hl-3">&#39;doc2&#39;</span><span class="hl-1">, </span><span class="hl-3">&#39;doesNotExist&#39;</span><span class="hl-1">]</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">results</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">bulkGetDictionary</span><span class="hl-1">(</span><span class="hl-2">config</span><span class="hl-1">, </span><span class="hl-2">ids</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-2">docSchema:</span><span class="hl-1"> </span><span class="hl-2">z</span><span class="hl-1">.</span><span class="hl-6">looseObject</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-2">_id:</span><span class="hl-1"> </span><span class="hl-2">z</span><span class="hl-1">.</span><span class="hl-6">string</span><span class="hl-1">(),</span><br/><span class="hl-1"> </span><span class="hl-2">data:</span><span class="hl-1"> </span><span class="hl-2">z</span><span class="hl-1">.</span><span class="hl-6">record</span><span class="hl-1">(</span><span class="hl-2">z</span><span class="hl-1">.</span><span class="hl-6">any</span><span class="hl-1">())</span><br/><span class="hl-1"> })</span><br/><span class="hl-1">})</span><br/><span class="hl-7">// results: {</span><br/><span class="hl-7">// found: {</span><br/><span class="hl-7">// doc1: { _id: &#39;doc2&#39;, _rev: &#39;1-221&#39;, data: {} },</span><br/><span class="hl-7">// doc2: { _id: &#39;doc2&#39;, _rev: &#39;4-421&#39;, data: {} },</span><br/><span class="hl-7">// },</span><br/><span class="hl-7">// notFound: {</span><br/><span class="hl-7">// doesNotExist: { key: &#39;doesNotExist&#39;, error: &#39;not_found&#39; }</span><br/><span class="hl-7">// }</span><br/><span class="hl-7">// }</span>
260
+ </code><button type="button">Copy</button></pre>
261
+
262
+ <h4 id="bulksavetransaction" class="tsd-anchor-link">bulkSaveTransaction<a href="#bulksavetransaction" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Perform a bulk save operation with all-or-nothing semantics.</p>
263
+ <p><strong>Parameters:</strong></p>
264
+ <ul>
265
+ <li><code>config</code>: Object with <code>couch</code> URL string</li>
266
+ <li><code>transactionId</code>: Unique identifier for the transaction</li>
267
+ <li><code>docs</code>: Array of document objects to save</li>
268
+ <li>Returns: Promise resolving to array of results with <code>ok</code>, <code>id</code>, <code>rev</code> for each doc</li>
269
+ </ul>
270
+ <p>This operation ensures that either all documents are saved successfully, or none are, maintaining data consistency. If any document fails to save, the operation will attempt to roll back all changes.</p>
271
+ <p>Note: The transactionId has to be unique for the lifetime of the app. It is used to prevent two processes from executing the same transaction. It is up to you to craft a transactionId that uniquely represents this transaction, and that also is the same if another process tries to generate it.</p>
272
+ <p>Exceptions to handle:</p>
273
+ <ul>
274
+ <li><code>TransactionSetupError</code>: Thrown if the transaction document cannot be created. Usually because it already exists</li>
275
+ <li><code>TransactionVersionConflictError</code>: Thrown if there are version conflicts with existing documents.</li>
276
+ <li><code>TransactionBulkOperationError</code>: Thrown if the bulk save operation fails for some documents.</li>
277
+ <li><code>TransactionRollbackError</code>: Thrown if the rollback operation fails after a transaction failure.</li>
278
+ </ul>
279
+ <pre><code class="javascript"><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = { </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1"> }</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">transactionId</span><span class="hl-1"> = </span><span class="hl-3">&#39;txn-123&#39;</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">docs</span><span class="hl-1"> = [</span><br/><span class="hl-1"> { </span><span class="hl-2">_id:</span><span class="hl-1"> </span><span class="hl-3">&#39;doc1&#39;</span><span class="hl-1">, </span><span class="hl-2">type:</span><span class="hl-1"> </span><span class="hl-3">&#39;user&#39;</span><span class="hl-1">, </span><span class="hl-2">name:</span><span class="hl-1"> </span><span class="hl-3">&#39;Alice&#39;</span><span class="hl-1">, </span><span class="hl-2">_rev:</span><span class="hl-1"> </span><span class="hl-3">&#39;1-abc123&#39;</span><span class="hl-1"> },</span><br/><span class="hl-1"> { </span><span class="hl-2">_id:</span><span class="hl-1"> </span><span class="hl-3">&#39;doc2&#39;</span><span class="hl-1">, </span><span class="hl-2">type:</span><span class="hl-1"> </span><span class="hl-3">&#39;user&#39;</span><span class="hl-1">, </span><span class="hl-2">name:</span><span class="hl-1"> </span><span class="hl-3">&#39;Bob&#39;</span><span class="hl-1">, </span><span class="hl-2">_rev:</span><span class="hl-1"> </span><span class="hl-3">&#39;1-def456&#39;</span><span class="hl-1"> }</span><br/><span class="hl-1">]</span><br/><br/><span class="hl-0">try</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">results</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">bulkSaveTransaction</span><span class="hl-1">(</span><span class="hl-2">config</span><span class="hl-1">, </span><span class="hl-2">transactionId</span><span class="hl-1">, </span><span class="hl-2">docs</span><span class="hl-1">)</span><br/><span class="hl-1"> </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">log</span><span class="hl-1">(</span><span class="hl-3">&#39;Transaction successful:&#39;</span><span class="hl-1">, </span><span class="hl-2">results</span><span class="hl-1">)</span><br/><span class="hl-1">} </span><span class="hl-0">catch</span><span class="hl-1"> (</span><span class="hl-2">error</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-0">if</span><span class="hl-1"> (</span><span class="hl-2">error</span><span class="hl-1"> </span><span class="hl-4">instanceof</span><span class="hl-1"> </span><span class="hl-10">TransactionSetupError</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-7">// the transaction could not start - usually an existing transaction with the same id</span><br/><span class="hl-1"> </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">error</span><span class="hl-1">(</span><span class="hl-3">&#39;Transaction setup failed:&#39;</span><span class="hl-1">, </span><span class="hl-2">error</span><span class="hl-1">)</span><br/><span class="hl-1"> } </span><span class="hl-0">else</span><span class="hl-1"> </span><span class="hl-0">if</span><span class="hl-1"> (</span><span class="hl-2">error</span><span class="hl-1"> </span><span class="hl-4">instanceof</span><span class="hl-1"> </span><span class="hl-10">TransactionVersionConflictError</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-7">// one or more of the versions of the docs provided dont match with what is currently in the db</span><br/><span class="hl-1"> </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">error</span><span class="hl-1">(</span><span class="hl-3">&#39;Version conflict error:&#39;</span><span class="hl-1">, </span><span class="hl-2">error</span><span class="hl-1">)</span><br/><span class="hl-1"> } </span><span class="hl-0">else</span><span class="hl-1"> </span><span class="hl-0">if</span><span class="hl-1"> (</span><span class="hl-2">error</span><span class="hl-1"> </span><span class="hl-4">instanceof</span><span class="hl-1"> </span><span class="hl-10">TransactionRollbackError</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-7">// the transaction was rolled back - so the &#39;or none&#39; condition occured</span><br/><span class="hl-1"> </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">error</span><span class="hl-1">(</span><span class="hl-3">&#39;Rollback error:&#39;</span><span class="hl-1">, </span><span class="hl-2">error</span><span class="hl-1">)</span><br/><span class="hl-1"> } </span><span class="hl-0">else</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">error</span><span class="hl-1">(</span><span class="hl-3">&#39;Unexpected error:&#39;</span><span class="hl-1">, </span><span class="hl-2">error</span><span class="hl-1">)</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">}</span>
280
+ </code><button type="button">Copy</button></pre>
281
+
282
+ <h4 id="getdbinfo" class="tsd-anchor-link">getDBInfo()<a href="#getdbinfo" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Get basic info about a db in couch</p>
283
+ <pre><code><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = { </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1"> }</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">result</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">getDBInfo</span><span class="hl-1">(</span><span class="hl-2">config</span><span class="hl-1">)</span><br/><span class="hl-7">// result: { db_name: &#39;test&#39;, doc_count: 3232 }</span>
284
+ </code><button>Copy</button></pre>
285
+
286
+ <h3 id="view-queries" class="tsd-anchor-link">View Queries<a href="#view-queries" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><h4 id="query" class="tsd-anchor-link">query<a href="#query" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Query a view with options.</p>
287
+ <p><strong>Parameters:</strong></p>
288
+ <ul>
289
+ <li><code>config</code>: Object with <code>couch</code> URL string</li>
290
+ <li><code>view</code>: View path string (e.g. '_design/doc/_view/name')</li>
291
+ <li><code>options</code>: Optional object with query parameters:
292
+ <ul>
293
+ <li><code>startkey</code>: Start key for range</li>
294
+ <li><code>endkey</code>: End key for range</li>
295
+ <li><code>key</code>: Exact key match</li>
296
+ <li><code>descending</code>: Boolean to reverse sort</li>
297
+ <li><code>skip</code>: Number of results to skip</li>
298
+ <li><code>limit</code>: Max number of results</li>
299
+ <li><code>include_docs</code>: Boolean to include full docs</li>
300
+ <li><code>reduce</code>: Boolean to reduce results</li>
301
+ <li><code>group</code>: Boolean to group results</li>
302
+ <li><code>group_level</code>: Number for group level</li>
303
+ </ul>
304
+ </li>
305
+ <li>Returns: Promise resolving to response with <code>rows</code> array</li>
306
+ </ul>
307
+ <pre><code class="javascript"><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = { </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1"> }</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">view</span><span class="hl-1"> = </span><span class="hl-3">&#39;_design/users/_view/by_name&#39;</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">options</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">startkey:</span><span class="hl-1"> </span><span class="hl-3">&#39;A&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">endkey:</span><span class="hl-1"> </span><span class="hl-3">&#39;B&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">include_docs:</span><span class="hl-1"> </span><span class="hl-4">true</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">limit:</span><span class="hl-1"> </span><span class="hl-8">10</span><br/><span class="hl-1">}</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">result</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">query</span><span class="hl-1">(</span><span class="hl-2">config</span><span class="hl-1">, </span><span class="hl-2">view</span><span class="hl-1">, </span><span class="hl-2">options</span><span class="hl-1">)</span><br/><span class="hl-7">// result: {</span><br/><span class="hl-7">// rows: [</span><br/><span class="hl-7">// {</span><br/><span class="hl-7">// id: &#39;doc1&#39;,</span><br/><span class="hl-7">// key: &#39;Alice&#39;,</span><br/><span class="hl-7">// value: 1,</span><br/><span class="hl-7">// doc: { _id: &#39;doc1&#39;, name: &#39;Alice&#39;, type: &#39;user&#39; }</span><br/><span class="hl-7">// },</span><br/><span class="hl-7">// // ... more rows</span><br/><span class="hl-7">// ]</span><br/><span class="hl-7">// }</span>
308
+ </code><button type="button">Copy</button></pre>
309
+
310
+ <p>Some notes on the keys. Use native js types for arrays keys, rather then strings. Eg</p>
311
+ <ul>
312
+ <li><code>{ startkey: ['ryan'], endkey: ['ryan', {}] }</code></li>
313
+ <li><code>{ startkey: [47, null], endkey: [48, null] }</code></li>
314
+ <li><code>{ startkey: [customerIdVar], endkey: [customerIdVar, {}] }</code></li>
315
+ <li><code>{ startkey: [teamId, userId, startTimestamp], endkey: [teamId, userId, endTimestamp] }</code></li>
316
+ </ul>
317
+ <h4 id="createquery" class="tsd-anchor-link">createQuery()<a href="#createquery" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Create a query builder to help construct view queries with a fluent interface. Note we have stuck to couch naming conventions and not camel case.</p>
318
+ <ul>
319
+ <li>Returns: QueryBuilder instance with methods:
320
+ <ul>
321
+ <li><code>key(value)</code>: Set exact key match</li>
322
+ <li><code>startkey(value)</code>: Set range start key</li>
323
+ <li><code>endkey(value)</code>: Set range end key</li>
324
+ <li><code>descending(bool)</code>: Set descending sort order</li>
325
+ <li><code>skip(number)</code>: Set number of results to skip</li>
326
+ <li><code>limit(number)</code>: Set max number of results</li>
327
+ <li><code>include_docs(bool)</code>: Include full documents</li>
328
+ <li><code>reduce(bool)</code>: Enable/disable reduce</li>
329
+ <li><code>group(bool)</code>: Enable/disable grouping</li>
330
+ <li><code>group_level(number)</code>: Set group level</li>
331
+ <li><code>build()</code>: Return the constructed query options object</li>
332
+ </ul>
333
+ </li>
334
+ </ul>
335
+ <pre><code class="javascript"><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">options</span><span class="hl-1"> = </span><span class="hl-6">createQuery</span><span class="hl-1">().</span><span class="hl-6">startkey</span><span class="hl-1">(</span><span class="hl-3">&#39;A&#39;</span><span class="hl-1">).</span><span class="hl-6">endkey</span><span class="hl-1">(</span><span class="hl-3">&#39;B&#39;</span><span class="hl-1">).</span><span class="hl-6">include_docs</span><span class="hl-1">(</span><span class="hl-4">true</span><span class="hl-1">).</span><span class="hl-6">limit</span><span class="hl-1">(</span><span class="hl-8">10</span><span class="hl-1">).</span><span class="hl-6">build</span><span class="hl-1">()</span><br/><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">result</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">query</span><span class="hl-1">(</span><span class="hl-2">config</span><span class="hl-1">, </span><span class="hl-2">view</span><span class="hl-1">, </span><span class="hl-2">options</span><span class="hl-1">)</span>
336
+ </code><button type="button">Copy</button></pre>
337
+
338
+ <p>Again, use js types for array keys</p>
339
+ <ul>
340
+ <li><code>.startkey([teamId, userId]).endkey([teamId, userId, {}])</code></li>
341
+ <li><code>.startkey([teamId, userId, startTimestamp]).endkey([teamId, userId, endTimestamp])</code></li>
342
+ </ul>
343
+ <h4 id="querystream" class="tsd-anchor-link">queryStream<a href="#querystream" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Use Cases <em>Streaming Data</em></p>
344
+ <p><strong>Parameters:</strong></p>
345
+ <ul>
346
+ <li><code>config</code>: Object with couch URL string</li>
347
+ <li><code>view</code>: View path string</li>
348
+ <li><code>options</code>: Query options object</li>
349
+ <li><code>onRow</code>: Function called for each row in the results</li>
350
+ </ul>
351
+ <p>Want to stream data from couch? You can with queryStream. It looks identical to query, except you add an extra 'onRow' function</p>
352
+ <p>Here is a small hapi example of streaming data from couch to the client as ndjson.
353
+ We do a small transform by only streaming the doc. you can do a lot of things in the onrow function.</p>
354
+ <pre><code><span class="hl-0">import</span><span class="hl-1"> </span><span class="hl-2">Hapi</span><span class="hl-1"> </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&#39;@hapi/hapi&#39;</span><span class="hl-1">;</span><br/><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">Readable</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&#39;stream&#39;</span><span class="hl-1">;</span><br/><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">queryStream</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-2">bindConfig</span><span class="hl-1">(</span><span class="hl-2">process</span><span class="hl-1">.</span><span class="hl-2">env</span><span class="hl-1">)</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">view</span><span class="hl-1"> = </span><span class="hl-3">&#39;_design/users/_view/by_name&#39;</span><br/><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-6">init</span><span class="hl-1"> = </span><span class="hl-4">async</span><span class="hl-1"> () </span><span class="hl-4">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">server</span><span class="hl-1"> = </span><span class="hl-2">Hapi</span><span class="hl-1">.</span><span class="hl-6">server</span><span class="hl-1">({ </span><span class="hl-2">port:</span><span class="hl-1"> </span><span class="hl-8">3000</span><span class="hl-1"> })</span><br/><span class="hl-1"> </span><span class="hl-2">server</span><span class="hl-1">.</span><span class="hl-6">route</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-2">method:</span><span class="hl-1"> </span><span class="hl-3">&#39;GET&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">path:</span><span class="hl-1"> </span><span class="hl-3">&#39;/stream&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">handler</span><span class="hl-2">:</span><span class="hl-1"> </span><span class="hl-4">async</span><span class="hl-1"> (</span><span class="hl-2">req</span><span class="hl-1">, </span><span class="hl-2">h</span><span class="hl-1">) </span><span class="hl-4">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">stream</span><span class="hl-1"> = </span><span class="hl-4">new</span><span class="hl-1"> </span><span class="hl-6">Readable</span><span class="hl-1">({ </span><span class="hl-6">read</span><span class="hl-1">() {} });</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-6">onRow</span><span class="hl-1"> = ({</span><span class="hl-2">id</span><span class="hl-1">, </span><span class="hl-2">key</span><span class="hl-1">, </span><span class="hl-2">value</span><span class="hl-1">, </span><span class="hl-2">doc</span><span class="hl-1">}) </span><span class="hl-4">=&gt;</span><span class="hl-1"> </span><span class="hl-2">stream</span><span class="hl-1">.</span><span class="hl-6">push</span><span class="hl-1">(</span><span class="hl-5">JSON</span><span class="hl-1">.</span><span class="hl-6">stringify</span><span class="hl-1">(</span><span class="hl-2">doc</span><span class="hl-1">) + </span><span class="hl-3">&#39;</span><span class="hl-11">\n</span><span class="hl-3">&#39;</span><span class="hl-1">)</span><br/><span class="hl-1"> </span><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">options</span><span class="hl-1"> = { </span><span class="hl-2">startkey:</span><span class="hl-1"> </span><span class="hl-2">req</span><span class="hl-1">.</span><span class="hl-2">query</span><span class="hl-1">.</span><span class="hl-2">startLetter</span><span class="hl-1">, </span><span class="hl-2">endkey:</span><span class="hl-1"> </span><span class="hl-2">req</span><span class="hl-1">.</span><span class="hl-2">query</span><span class="hl-1">.</span><span class="hl-2">startLetter</span><span class="hl-1"> + </span><span class="hl-3">&#39;|&#39;</span><span class="hl-1">, </span><span class="hl-2">include_docs:</span><span class="hl-1"> </span><span class="hl-4">true</span><span class="hl-1">}</span><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">queryStream</span><span class="hl-1">(</span><span class="hl-2">view</span><span class="hl-1">, </span><span class="hl-2">options</span><span class="hl-1">, </span><span class="hl-2">onRow</span><span class="hl-1">)</span><br/><span class="hl-1"> </span><span class="hl-2">stream</span><span class="hl-1">.</span><span class="hl-6">push</span><span class="hl-1">(</span><span class="hl-4">null</span><span class="hl-1">) </span><span class="hl-7">// end stream</span><br/><span class="hl-1"> </span><span class="hl-0">return</span><span class="hl-1"> </span><span class="hl-2">h</span><span class="hl-1">.</span><span class="hl-6">response</span><span class="hl-1">(</span><span class="hl-2">stream</span><span class="hl-1">).</span><span class="hl-6">type</span><span class="hl-1">(</span><span class="hl-3">&#39;application/x-ndjson&#39;</span><span class="hl-1">);</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> })</span><br/><br/><span class="hl-1"> </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-2">server</span><span class="hl-1">.</span><span class="hl-6">start</span><span class="hl-1">();</span><br/><span class="hl-1"> </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">log</span><span class="hl-1">(</span><span class="hl-3">`Server running on </span><span class="hl-4">${</span><span class="hl-2">server</span><span class="hl-12">.</span><span class="hl-2">info</span><span class="hl-12">.</span><span class="hl-2">uri</span><span class="hl-4">}</span><span class="hl-3">`</span><span class="hl-1">);</span><br/><span class="hl-1">}</span><br/><span class="hl-6">init</span><span class="hl-1">()</span>
355
+ </code><button>Copy</button></pre>
356
+
357
+ <p>Want to consume this in the browser? I'd recommend <a href="https://www.npmjs.com/package/ndjson-readablestream">ndjson-readablestream</a>
358
+ An <a href="https://github.com/Azure-Samples/azure-search-openai-demo/pull/532/files#diff-506debba46b93087dc46a916384e56392808bcc02a99d9291557f3e674d4ad6c">example react component</a>
359
+ that consumes the readable stream.</p>
360
+ <h4 id="changes-feed-companion" class="tsd-anchor-link">Changes feed companion<a href="#changes-feed-companion" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>The main client no longer bundles the legacy <code>changes-stream</code> dependency. Install <code>hide-a-bed-changes</code> when you need a CouchDB <code>_changes</code> feed helper:</p>
361
+ <pre><code><span class="hl-2">npm</span><span class="hl-1"> </span><span class="hl-2">install</span><span class="hl-1"> </span><span class="hl-2">hide</span><span class="hl-1">-</span><span class="hl-2">a</span><span class="hl-1">-</span><span class="hl-2">bed</span><span class="hl-1">-</span><span class="hl-2">changes</span>
362
+ </code><button>Copy</button></pre>
363
+
364
+ <p>Usage mirrors the original API:</p>
365
+ <pre><code class="javascript"><span class="hl-0">import</span><span class="hl-1"> { </span><span class="hl-2">changes</span><span class="hl-1"> } </span><span class="hl-0">from</span><span class="hl-1"> </span><span class="hl-3">&#39;hide-a-bed-changes&#39;</span><br/><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = { </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1"> }</span><br/><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">feed</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">changes</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-2">config</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">change</span><span class="hl-1"> </span><span class="hl-4">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">log</span><span class="hl-1">(</span><span class="hl-3">&#39;Document changed:&#39;</span><span class="hl-1">, </span><span class="hl-2">change</span><span class="hl-1">.</span><span class="hl-2">id</span><span class="hl-1">)</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> { </span><span class="hl-2">since:</span><span class="hl-1"> </span><span class="hl-3">&#39;now&#39;</span><span class="hl-1">, </span><span class="hl-2">include_docs:</span><span class="hl-1"> </span><span class="hl-4">true</span><span class="hl-1"> }</span><br/><span class="hl-1">)</span><br/><br/><span class="hl-2">feed</span><span class="hl-1">.</span><span class="hl-6">on</span><span class="hl-1">(</span><span class="hl-3">&#39;error&#39;</span><span class="hl-1">, </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-2">error</span><span class="hl-1">)</span><br/><br/><span class="hl-7">// later</span><br/><span class="hl-2">feed</span><span class="hl-1">.</span><span class="hl-6">stop</span><span class="hl-1">()</span>
366
+ </code><button type="button">Copy</button></pre>
367
+
368
+ <p><code>hide-a-bed-changes</code> reuses the same config structure, merges <code>config.needleOpts</code>, and resolves <code>since: 'now'</code> to the current <code>update_seq</code> before starting the feed.</p>
369
+ <h4 id="watchdocs-" class="tsd-anchor-link">watchDocs ()<a href="#watchdocs-" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Watch specific documents for changes in real-time.</p>
370
+ <p><strong>Parameters:</strong></p>
371
+ <ul>
372
+ <li><code>config</code>: Object with <code>couch</code> URL string</li>
373
+ <li><code>docIds</code>: String or array of document IDs to watch (max 100)</li>
374
+ <li><code>onChange</code>: Function called for each change</li>
375
+ <li><code>options</code>: Optional object with parameters:
376
+ <ul>
377
+ <li><code>include_docs</code>: Boolean - include full documents (default false)</li>
378
+ <li><code>maxRetries</code>: Number - maximum reconnection attempts (default: 10)</li>
379
+ <li><code>initialDelay</code>: Number - initial reconnection delay in ms (default 1000)</li>
380
+ <li><code>maxDelay</code>: Number - maximum reconnection delay in ms (default: 30000)</li>
381
+ </ul>
382
+ </li>
383
+ </ul>
384
+ <p>Returns an EventEmitter that emits:</p>
385
+ <ul>
386
+ <li>'change' events with change objects.</li>
387
+ <li>'error' events when max retries reached.</li>
388
+ <li>'end' events with last sequence number.</li>
389
+ </ul>
390
+ <pre><code class="javascript"><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = { </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1"> }</span><br/><br/><span class="hl-7">// Watch a single document</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">feed</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">watchDocs</span><span class="hl-1">(</span><span class="hl-2">config</span><span class="hl-1">, </span><span class="hl-3">&#39;doc123&#39;</span><span class="hl-1">, </span><span class="hl-2">change</span><span class="hl-1"> </span><span class="hl-4">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">log</span><span class="hl-1">(</span><span class="hl-3">&#39;Document changed:&#39;</span><span class="hl-1">, </span><span class="hl-2">change</span><span class="hl-1">.</span><span class="hl-2">id</span><span class="hl-1">)</span><br/><span class="hl-1"> </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">log</span><span class="hl-1">(</span><span class="hl-3">&#39;New revision:&#39;</span><span class="hl-1">, </span><span class="hl-2">change</span><span class="hl-1">.</span><span class="hl-2">changes</span><span class="hl-1">[</span><span class="hl-8">0</span><span class="hl-1">].</span><span class="hl-2">rev</span><span class="hl-1">)</span><br/><span class="hl-1">})</span><br/><br/><span class="hl-7">// Watch multiple documents with full doc content</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">feed</span><span class="hl-1"> = </span><span class="hl-0">await</span><span class="hl-1"> </span><span class="hl-6">watchDocs</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-2">config</span><span class="hl-1">,</span><br/><span class="hl-1"> [</span><span class="hl-3">&#39;doc1&#39;</span><span class="hl-1">, </span><span class="hl-3">&#39;doc2&#39;</span><span class="hl-1">, </span><span class="hl-3">&#39;doc3&#39;</span><span class="hl-1">],</span><br/><span class="hl-1"> </span><span class="hl-2">change</span><span class="hl-1"> </span><span class="hl-4">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-0">if</span><span class="hl-1"> (</span><span class="hl-2">change</span><span class="hl-1">.</span><span class="hl-2">doc</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">log</span><span class="hl-1">(</span><span class="hl-3">&#39;Updated document:&#39;</span><span class="hl-1">, </span><span class="hl-2">change</span><span class="hl-1">.</span><span class="hl-2">doc</span><span class="hl-1">)</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> { </span><span class="hl-2">include_docs:</span><span class="hl-1"> </span><span class="hl-4">true</span><span class="hl-1"> }</span><br/><span class="hl-1">)</span><br/><br/><span class="hl-7">// Handle errors</span><br/><span class="hl-2">feed</span><span class="hl-1">.</span><span class="hl-6">on</span><span class="hl-1">(</span><span class="hl-3">&#39;error&#39;</span><span class="hl-1">, </span><span class="hl-2">error</span><span class="hl-1"> </span><span class="hl-4">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">error</span><span class="hl-1">(</span><span class="hl-3">&#39;Watch error:&#39;</span><span class="hl-1">, </span><span class="hl-2">error</span><span class="hl-1">)</span><br/><span class="hl-1">})</span><br/><br/><span class="hl-7">// Handle end of feed</span><br/><span class="hl-2">feed</span><span class="hl-1">.</span><span class="hl-6">on</span><span class="hl-1">(</span><span class="hl-3">&#39;end&#39;</span><span class="hl-1">, ({ </span><span class="hl-2">lastSeq</span><span class="hl-1"> }) </span><span class="hl-4">=&gt;</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">log</span><span class="hl-1">(</span><span class="hl-3">&#39;Feed ended at sequence:&#39;</span><span class="hl-1">, </span><span class="hl-2">lastSeq</span><span class="hl-1">)</span><br/><span class="hl-1">})</span><br/><br/><span class="hl-7">// Stop watching</span><br/><span class="hl-2">feed</span><span class="hl-1">.</span><span class="hl-6">stop</span><span class="hl-1">()</span>
391
+ </code><button type="button">Copy</button></pre>
392
+
393
+ <p>The watchDocs feed is useful for:</p>
394
+ <ol>
395
+ <li>Building real-time applications focused on specific documents</li>
396
+ <li>Triggering actions when particular documents change</li>
397
+ <li>Maintaining cached copies of frequently-accessed documents</li>
398
+ </ol>
399
+ <h3 id="advanced-config-options" class="tsd-anchor-link">Advanced Config Options<a href="#advanced-config-options" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><p>The config object supports the following properties:</p>
400
+ <table>
401
+ <thead>
402
+ <tr>
403
+ <th>Property</th>
404
+ <th>Type</th>
405
+ <th>Default</th>
406
+ <th>Description</th>
407
+ </tr>
408
+ </thead>
409
+ <tbody>
410
+ <tr>
411
+ <td>couch</td>
412
+ <td>string</td>
413
+ <td>required</td>
414
+ <td>The URL of the CouchDB database</td>
415
+ </tr>
416
+ <tr>
417
+ <td>throwOnGetNotFound</td>
418
+ <td>boolean</td>
419
+ <td>false</td>
420
+ <td>If true, throws an error when get() returns 404. If false, returns null</td>
421
+ </tr>
422
+ <tr>
423
+ <td>bindWithRetry</td>
424
+ <td>boolean</td>
425
+ <td>true</td>
426
+ <td>When using bindConfig(), adds retry logic to bound methods</td>
427
+ </tr>
428
+ <tr>
429
+ <td>maxRetries</td>
430
+ <td>number</td>
431
+ <td>3</td>
432
+ <td>Maximum number of retry attempts for retryable operations</td>
433
+ </tr>
434
+ <tr>
435
+ <td>initialDelay</td>
436
+ <td>number</td>
437
+ <td>1000</td>
438
+ <td>Initial delay in milliseconds before first retry</td>
439
+ </tr>
440
+ <tr>
441
+ <td>backoffFactor</td>
442
+ <td>number</td>
443
+ <td>2</td>
444
+ <td>Multiplier for exponential backoff between retries</td>
445
+ </tr>
446
+ <tr>
447
+ <td>useConsoleLogger</td>
448
+ <td>boolean</td>
449
+ <td>false</td>
450
+ <td>If true, enables console logging when no logger is provided</td>
451
+ </tr>
452
+ <tr>
453
+ <td>logger</td>
454
+ <td>object/function</td>
455
+ <td>undefined</td>
456
+ <td>Custom logging interface (winston-style object or function)</td>
457
+ </tr>
458
+ </tbody>
459
+ </table>
460
+ <p>Example configuration with all options:</p>
461
+ <pre><code class="javascript"><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">throwOnGetNotFound:</span><span class="hl-1"> </span><span class="hl-4">true</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">bindWithRetry:</span><span class="hl-1"> </span><span class="hl-4">true</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">maxRetries:</span><span class="hl-1"> </span><span class="hl-8">5</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">initialDelay:</span><span class="hl-1"> </span><span class="hl-8">2000</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">backoffFactor:</span><span class="hl-1"> </span><span class="hl-8">1.5</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">useConsoleLogger:</span><span class="hl-1"> </span><span class="hl-4">true</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">logger</span><span class="hl-2">:</span><span class="hl-1"> (</span><span class="hl-2">level</span><span class="hl-1">, ...</span><span class="hl-2">args</span><span class="hl-1">) </span><span class="hl-4">=&gt;</span><span class="hl-1"> </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">log</span><span class="hl-1">(</span><span class="hl-2">level</span><span class="hl-1">, ...</span><span class="hl-2">args</span><span class="hl-1">)</span><br/><span class="hl-1">}</span>
462
+ </code><button type="button">Copy</button></pre>
463
+
464
+ <h3 id="logging-support" class="tsd-anchor-link">Logging Support<a href="#logging-support" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3><p>The library supports flexible logging options that can be configured through the config object:</p>
465
+ <pre><code class="javascript"><span class="hl-7">// Enable console logging (error, warn, info, debug)</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">useConsoleLogger:</span><span class="hl-1"> </span><span class="hl-4">true</span><br/><span class="hl-1">}</span><br/><br/><span class="hl-7">// Use a custom logger object (winston-style)</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">logger:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-6">error</span><span class="hl-2">:</span><span class="hl-1"> </span><span class="hl-2">msg</span><span class="hl-1"> </span><span class="hl-4">=&gt;</span><span class="hl-1"> </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">error</span><span class="hl-1">(</span><span class="hl-2">msg</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-6">warn</span><span class="hl-2">:</span><span class="hl-1"> </span><span class="hl-2">msg</span><span class="hl-1"> </span><span class="hl-4">=&gt;</span><span class="hl-1"> </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">warn</span><span class="hl-1">(</span><span class="hl-2">msg</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-6">info</span><span class="hl-2">:</span><span class="hl-1"> </span><span class="hl-2">msg</span><span class="hl-1"> </span><span class="hl-4">=&gt;</span><span class="hl-1"> </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">info</span><span class="hl-1">(</span><span class="hl-2">msg</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-6">debug</span><span class="hl-2">:</span><span class="hl-1"> </span><span class="hl-2">msg</span><span class="hl-1"> </span><span class="hl-4">=&gt;</span><span class="hl-1"> </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">debug</span><span class="hl-1">(</span><span class="hl-2">msg</span><span class="hl-1">)</span><br/><span class="hl-1"> }</span><br/><span class="hl-1">}</span><br/><br/><span class="hl-7">// Use a simple function logger</span><br/><span class="hl-4">const</span><span class="hl-1"> </span><span class="hl-5">config</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">couch:</span><span class="hl-1"> </span><span class="hl-3">&#39;http://localhost:5984/mydb&#39;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-6">logger</span><span class="hl-2">:</span><span class="hl-1"> (</span><span class="hl-2">level</span><span class="hl-1">, ...</span><span class="hl-2">args</span><span class="hl-1">) </span><span class="hl-4">=&gt;</span><span class="hl-1"> </span><span class="hl-2">console</span><span class="hl-1">.</span><span class="hl-6">log</span><span class="hl-1">(</span><span class="hl-2">level</span><span class="hl-1">, ...</span><span class="hl-2">args</span><span class="hl-1">)</span><br/><span class="hl-1">}</span>
466
+ </code><button type="button">Copy</button></pre>
467
+
468
+ <p>The logger will track operations including:</p>
469
+ <ul>
470
+ <li>Document operations (get, put, patch)</li>
471
+ <li>Bulk operations</li>
472
+ <li>View queries</li>
473
+ <li>Streaming operations</li>
474
+ <li>Retries and error handling</li>
475
+ </ul>
476
+ <p>Each operation logs appropriate information at these levels:</p>
477
+ <ul>
478
+ <li>error: Fatal/unrecoverable errors.</li>
479
+ <li>warn: Retryable errors, conflicts.</li>
480
+ <li>info: Operation start/completion.</li>
481
+ <li>debug: Detailed operation information.</li>
482
+ </ul>
483
+ </div></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="assets/icons.svg#icon-chevronDown"></use></svg><h3>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#api-quick-reference"><span>API <wbr/>Quick <wbr/>Reference</span></a><a href="#setup"><span>Setup</span></a><a href="#config"><span>Config</span></a><ul><li><a href="#bindconfig"><span>bind<wbr/>Config</span></a></li><li><ul><li><a href="#config-overrides"><span>Config <wbr/>Overrides</span></a></li></ul></li></ul><a href="#document-operations"><span>Document <wbr/>Operations</span></a><ul><li><a href="#get"><span>get</span></a></li><li><a href="#put"><span>put</span></a></li><li><a href="#patch"><span>patch</span></a></li><li><a href="#patchdangerously"><span>patch<wbr/>Dangerously</span></a></li><li><a href="#getatrev"><span>get<wbr/>At<wbr/>Rev</span></a></li><li><a href="#createlock"><span>create<wbr/>Lock</span></a></li><li><a href="#removelock"><span>remove<wbr/>Lock</span></a></li></ul><a href="#bulk-operations"><span>Bulk <wbr/>Operations</span></a><ul><li><a href="#bulksave"><span>bulk<wbr/>Save</span></a></li><li><a href="#bulkget"><span>bulk<wbr/>Get</span></a></li><li><a href="#bulkremove"><span>bulk<wbr/>Remove</span></a></li><li><a href="#remove"><span>remove</span></a></li><li><a href="#bulkremovemap"><span>bulk<wbr/>Remove<wbr/>Map</span></a></li><li><a href="#bulkgetdictionary"><span>bulk<wbr/>Get<wbr/>Dictionary</span></a></li><li><a href="#bulksavetransaction"><span>bulk<wbr/>Save<wbr/>Transaction</span></a></li><li><a href="#getdbinfo"><span>get<wbr/>DB<wbr/>Info()</span></a></li></ul><a href="#view-queries"><span>View <wbr/>Queries</span></a><ul><li><a href="#query"><span>query</span></a></li><li><a href="#createquery"><span>create<wbr/>Query()</span></a></li><li><a href="#querystream"><span>query<wbr/>Stream</span></a></li><li><a href="#changes-feed-companion"><span>Changes feed companion</span></a></li><li><a href="#watchdocs-"><span>watch<wbr/>Docs ()</span></a></li></ul><a href="#advanced-config-options"><span>Advanced <wbr/>Config <wbr/>Options</span></a><a href="#logging-support"><span>Logging <wbr/>Support</span></a></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="modules.html">@brivity/hide-a-bed</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>