@upstash/redis 1.40.0 → 1.41.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 (475) hide show
  1. package/README.md +5 -0
  2. package/{chunk-RLVWMRRX.mjs → chunk-CGMWROAN.mjs} +557 -4
  3. package/cloudflare.d.mts +2 -2
  4. package/cloudflare.d.ts +2 -2
  5. package/cloudflare.js +557 -4
  6. package/cloudflare.mjs +1 -1
  7. package/docs/advanced.mdx +83 -0
  8. package/docs/commands/array/arcount.mdx +28 -0
  9. package/docs/commands/array/ardel.mdx +30 -0
  10. package/docs/commands/array/ardelrange.mdx +32 -0
  11. package/docs/commands/array/arget.mdx +33 -0
  12. package/docs/commands/array/argetrange.mdx +38 -0
  13. package/docs/commands/array/argrep.mdx +69 -0
  14. package/docs/commands/array/arinfo.mdx +49 -0
  15. package/docs/commands/array/arinsert.mdx +32 -0
  16. package/docs/commands/array/arlastitems.mdx +40 -0
  17. package/docs/commands/array/arlen.mdx +28 -0
  18. package/docs/commands/array/armget.mdx +31 -0
  19. package/docs/commands/array/armset.mdx +31 -0
  20. package/docs/commands/array/arnext.mdx +25 -0
  21. package/docs/commands/array/arop.mdx +44 -0
  22. package/docs/commands/array/arring.mdx +36 -0
  23. package/docs/commands/array/arscan.mdx +42 -0
  24. package/docs/commands/array/arseek.mdx +34 -0
  25. package/docs/commands/array/arset.mdx +35 -0
  26. package/docs/commands/auth/echo.mdx +24 -0
  27. package/docs/commands/auth/ping.mdx +21 -0
  28. package/docs/commands/bitmap/bitcount.mdx +39 -0
  29. package/docs/commands/bitmap/bitop.mdx +142 -0
  30. package/docs/commands/bitmap/bitpos.mdx +39 -0
  31. package/docs/commands/bitmap/getbit.mdx +28 -0
  32. package/docs/commands/bitmap/setbit.mdx +31 -0
  33. package/docs/commands/connection/client_setinfo.mdx +91 -0
  34. package/docs/commands/functions/call.mdx +72 -0
  35. package/docs/commands/functions/call_ro.mdx +57 -0
  36. package/docs/commands/functions/delete.mdx +22 -0
  37. package/docs/commands/functions/flush.mdx +16 -0
  38. package/docs/commands/functions/list.mdx +72 -0
  39. package/docs/commands/functions/load.mdx +64 -0
  40. package/docs/commands/functions/stats.mdx +46 -0
  41. package/docs/commands/generic/del.mdx +29 -0
  42. package/docs/commands/generic/exists.mdx +26 -0
  43. package/docs/commands/generic/expire.mdx +29 -0
  44. package/docs/commands/generic/expireat.mdx +29 -0
  45. package/docs/commands/generic/keys.mdx +32 -0
  46. package/docs/commands/generic/persist.mdx +23 -0
  47. package/docs/commands/generic/pexpire.mdx +28 -0
  48. package/docs/commands/generic/pexpireat.mdx +29 -0
  49. package/docs/commands/generic/pttl.mdx +23 -0
  50. package/docs/commands/generic/randomkey.mdx +21 -0
  51. package/docs/commands/generic/rename.mdx +28 -0
  52. package/docs/commands/generic/renamenx.mdx +28 -0
  53. package/docs/commands/generic/scan.mdx +38 -0
  54. package/docs/commands/generic/touch.mdx +23 -0
  55. package/docs/commands/generic/ttl.mdx +23 -0
  56. package/docs/commands/generic/type.mdx +27 -0
  57. package/docs/commands/generic/unlink.mdx +29 -0
  58. package/docs/commands/hash/hdel.mdx +28 -0
  59. package/docs/commands/hash/hexists.mdx +30 -0
  60. package/docs/commands/hash/hexpire.mdx +49 -0
  61. package/docs/commands/hash/hexpireat.mdx +48 -0
  62. package/docs/commands/hash/hexpiretime.mdx +35 -0
  63. package/docs/commands/hash/hget.mdx +29 -0
  64. package/docs/commands/hash/hgetall.mdx +27 -0
  65. package/docs/commands/hash/hgetdel.mdx +67 -0
  66. package/docs/commands/hash/hgetex.mdx +123 -0
  67. package/docs/commands/hash/hincrby.mdx +34 -0
  68. package/docs/commands/hash/hincrbyfloat.mdx +34 -0
  69. package/docs/commands/hash/hkeys.mdx +28 -0
  70. package/docs/commands/hash/hlen.mdx +28 -0
  71. package/docs/commands/hash/hmget.mdx +33 -0
  72. package/docs/commands/hash/hpersist.mdx +37 -0
  73. package/docs/commands/hash/hpexpire.mdx +50 -0
  74. package/docs/commands/hash/hpexpireat.mdx +48 -0
  75. package/docs/commands/hash/hpexpiretime.mdx +35 -0
  76. package/docs/commands/hash/hpttl.mdx +35 -0
  77. package/docs/commands/hash/hrandfield.mdx +57 -0
  78. package/docs/commands/hash/hscan.mdx +65 -0
  79. package/docs/commands/hash/hset.mdx +32 -0
  80. package/docs/commands/hash/hsetex.mdx +186 -0
  81. package/docs/commands/hash/hsetnx.mdx +30 -0
  82. package/docs/commands/hash/hstrlen.mdx +28 -0
  83. package/docs/commands/hash/httl.mdx +35 -0
  84. package/docs/commands/hash/hvals.mdx +29 -0
  85. package/docs/commands/json/arrappend.mdx +35 -0
  86. package/docs/commands/json/arrindex.mdx +37 -0
  87. package/docs/commands/json/arrinsert.mdx +34 -0
  88. package/docs/commands/json/arrlen.mdx +26 -0
  89. package/docs/commands/json/arrpop.mdx +36 -0
  90. package/docs/commands/json/arrtrim.mdx +34 -0
  91. package/docs/commands/json/clear.mdx +30 -0
  92. package/docs/commands/json/del.mdx +26 -0
  93. package/docs/commands/json/forget.mdx +26 -0
  94. package/docs/commands/json/get.mdx +53 -0
  95. package/docs/commands/json/merge.mdx +32 -0
  96. package/docs/commands/json/mget.mdx +27 -0
  97. package/docs/commands/json/mset.mdx +26 -0
  98. package/docs/commands/json/numincrby.mdx +33 -0
  99. package/docs/commands/json/nummultby.mdx +33 -0
  100. package/docs/commands/json/objkeys.mdx +27 -0
  101. package/docs/commands/json/objlen.mdx +27 -0
  102. package/docs/commands/json/set.mdx +42 -0
  103. package/docs/commands/json/strappend.mdx +32 -0
  104. package/docs/commands/json/strlen.mdx +26 -0
  105. package/docs/commands/json/toggle.mdx +28 -0
  106. package/docs/commands/json/type.mdx +28 -0
  107. package/docs/commands/list/lindex.mdx +32 -0
  108. package/docs/commands/list/linsert.mdx +41 -0
  109. package/docs/commands/list/llen.mdx +26 -0
  110. package/docs/commands/list/lmove.mdx +34 -0
  111. package/docs/commands/list/lpop.mdx +37 -0
  112. package/docs/commands/list/lpos.mdx +56 -0
  113. package/docs/commands/list/lpush.mdx +32 -0
  114. package/docs/commands/list/lpushx.mdx +38 -0
  115. package/docs/commands/list/lrange.mdx +37 -0
  116. package/docs/commands/list/lrem.mdx +33 -0
  117. package/docs/commands/list/lset.mdx +34 -0
  118. package/docs/commands/list/ltrim.mdx +33 -0
  119. package/docs/commands/list/rpop.mdx +37 -0
  120. package/docs/commands/list/rpush.mdx +32 -0
  121. package/docs/commands/list/rpushx.mdx +38 -0
  122. package/docs/commands/overview.mdx +692 -0
  123. package/docs/commands/pubsub/psubscribe.mdx +36 -0
  124. package/docs/commands/pubsub/publish.mdx +27 -0
  125. package/docs/commands/pubsub/subscribe.mdx +28 -0
  126. package/docs/commands/scripts/eval.mdx +36 -0
  127. package/docs/commands/scripts/eval_ro.mdx +36 -0
  128. package/docs/commands/scripts/evalsha.mdx +36 -0
  129. package/docs/commands/scripts/evalsha_ro.mdx +36 -0
  130. package/docs/commands/scripts/script_exists.mdx +26 -0
  131. package/docs/commands/scripts/script_flush.mdx +28 -0
  132. package/docs/commands/scripts/script_load.mdx +28 -0
  133. package/docs/commands/server/dbsize.mdx +22 -0
  134. package/docs/commands/server/flushall.mdx +25 -0
  135. package/docs/commands/server/flushdb.mdx +25 -0
  136. package/docs/commands/set/sadd.mdx +32 -0
  137. package/docs/commands/set/scard.mdx +26 -0
  138. package/docs/commands/set/sdiff.mdx +27 -0
  139. package/docs/commands/set/sdiffstore.mdx +32 -0
  140. package/docs/commands/set/sinter.mdx +27 -0
  141. package/docs/commands/set/sinterstore.mdx +33 -0
  142. package/docs/commands/set/sismember.mdx +30 -0
  143. package/docs/commands/set/smembers.mdx +25 -0
  144. package/docs/commands/set/smismember.mdx +31 -0
  145. package/docs/commands/set/smove.mdx +34 -0
  146. package/docs/commands/set/spop.mdx +36 -0
  147. package/docs/commands/set/srandmember.mdx +36 -0
  148. package/docs/commands/set/srem.mdx +29 -0
  149. package/docs/commands/set/sscan.mdx +39 -0
  150. package/docs/commands/set/sunion.mdx +27 -0
  151. package/docs/commands/set/sunionstore.mdx +33 -0
  152. package/docs/commands/stream/xack.mdx +37 -0
  153. package/docs/commands/stream/xackdel.mdx +211 -0
  154. package/docs/commands/stream/xadd.mdx +137 -0
  155. package/docs/commands/stream/xautoclaim.mdx +80 -0
  156. package/docs/commands/stream/xclaim.mdx +84 -0
  157. package/docs/commands/stream/xdel.mdx +34 -0
  158. package/docs/commands/stream/xdelex.mdx +119 -0
  159. package/docs/commands/stream/xgroup.mdx +141 -0
  160. package/docs/commands/stream/xinfo.mdx +77 -0
  161. package/docs/commands/stream/xlen.mdx +22 -0
  162. package/docs/commands/stream/xpending.mdx +75 -0
  163. package/docs/commands/stream/xrange.mdx +59 -0
  164. package/docs/commands/stream/xread.mdx +65 -0
  165. package/docs/commands/stream/xreadgroup.mdx +87 -0
  166. package/docs/commands/stream/xrevrange.mdx +65 -0
  167. package/docs/commands/stream/xtrim.mdx +75 -0
  168. package/docs/commands/string/append.mdx +28 -0
  169. package/docs/commands/string/decr.mdx +27 -0
  170. package/docs/commands/string/decrby.mdx +30 -0
  171. package/docs/commands/string/get.mdx +34 -0
  172. package/docs/commands/string/getdel.mdx +29 -0
  173. package/docs/commands/string/getrange.mdx +34 -0
  174. package/docs/commands/string/getset.mdx +28 -0
  175. package/docs/commands/string/incr.mdx +27 -0
  176. package/docs/commands/string/incrby.mdx +30 -0
  177. package/docs/commands/string/incrbyfloat.mdx +30 -0
  178. package/docs/commands/string/mget.mdx +31 -0
  179. package/docs/commands/string/mset.mdx +32 -0
  180. package/docs/commands/string/msetnx.mdx +29 -0
  181. package/docs/commands/string/set.mdx +79 -0
  182. package/docs/commands/string/setrange.mdx +38 -0
  183. package/docs/commands/string/strlen.mdx +26 -0
  184. package/docs/commands/transaction.mdx +22 -0
  185. package/docs/commands/zset/zadd.mdx +102 -0
  186. package/docs/commands/zset/zcard.mdx +31 -0
  187. package/docs/commands/zset/zcount.mdx +47 -0
  188. package/docs/commands/zset/zdiffstore.mdx +33 -0
  189. package/docs/commands/zset/zincrby.mdx +37 -0
  190. package/docs/commands/zset/zinterstore.mdx +98 -0
  191. package/docs/commands/zset/zlexcount.mdx +43 -0
  192. package/docs/commands/zset/zmscore.mdx +34 -0
  193. package/docs/commands/zset/zpopmax.mdx +25 -0
  194. package/docs/commands/zset/zpopmin.mdx +25 -0
  195. package/docs/commands/zset/zrange.mdx +85 -0
  196. package/docs/commands/zset/zrank.mdx +29 -0
  197. package/docs/commands/zset/zrem.mdx +33 -0
  198. package/docs/commands/zset/zremrangebylex.mdx +32 -0
  199. package/docs/commands/zset/zremrangebyrank.mdx +32 -0
  200. package/docs/commands/zset/zremrangebyscore.mdx +32 -0
  201. package/docs/commands/zset/zrevrank.mdx +29 -0
  202. package/docs/commands/zset/zscan.mdx +58 -0
  203. package/docs/commands/zset/zscore.mdx +34 -0
  204. package/docs/commands/zset/zunionstore.mdx +98 -0
  205. package/docs/deployment.mdx +117 -0
  206. package/docs/developing.mdx +118 -0
  207. package/docs/getstarted.mdx +68 -0
  208. package/docs/overview.mdx +29 -0
  209. package/docs/pipelining/auto-pipeline.mdx +108 -0
  210. package/docs/pipelining/pipeline-transaction.mdx +65 -0
  211. package/docs/retries.mdx +24 -0
  212. package/docs/troubleshooting.mdx +80 -0
  213. package/{error-BNzLTXJG.d.mts → error-4e36-PC0.d.mts} +838 -8
  214. package/{error-BNzLTXJG.d.ts → error-4e36-PC0.d.ts} +838 -8
  215. package/fastly.d.mts +2 -2
  216. package/fastly.d.ts +2 -2
  217. package/fastly.js +557 -4
  218. package/fastly.mjs +1 -1
  219. package/nodejs.d.mts +34 -2
  220. package/nodejs.d.ts +34 -2
  221. package/nodejs.js +586 -4
  222. package/nodejs.mjs +30 -1
  223. package/package.json +16 -5
  224. package/src/pkg/auto-pipeline.ts +284 -0
  225. package/src/pkg/commands/append.ts +12 -0
  226. package/src/pkg/commands/arcount.ts +14 -0
  227. package/src/pkg/commands/ardel.ts +19 -0
  228. package/src/pkg/commands/ardelrange.ts +19 -0
  229. package/src/pkg/commands/arget.ts +17 -0
  230. package/src/pkg/commands/argetrange.ts +20 -0
  231. package/src/pkg/commands/argrep.ts +109 -0
  232. package/src/pkg/commands/arinfo.ts +88 -0
  233. package/src/pkg/commands/arinsert.ts +24 -0
  234. package/src/pkg/commands/arlastitems.ts +29 -0
  235. package/src/pkg/commands/arlen.ts +23 -0
  236. package/src/pkg/commands/armget.ts +18 -0
  237. package/src/pkg/commands/armset.ts +26 -0
  238. package/src/pkg/commands/arnext.ts +20 -0
  239. package/src/pkg/commands/arop.ts +48 -0
  240. package/src/pkg/commands/arring.ts +23 -0
  241. package/src/pkg/commands/arscan.ts +44 -0
  242. package/src/pkg/commands/arseek.ts +17 -0
  243. package/src/pkg/commands/arset.ts +20 -0
  244. package/src/pkg/commands/bitcount.ts +30 -0
  245. package/src/pkg/commands/bitfield.ts +50 -0
  246. package/src/pkg/commands/bitop.ts +35 -0
  247. package/src/pkg/commands/bitpos.ts +15 -0
  248. package/src/pkg/commands/client_setinfo.ts +17 -0
  249. package/src/pkg/commands/command.ts +142 -0
  250. package/src/pkg/commands/copy.ts +22 -0
  251. package/src/pkg/commands/dbsize.ts +12 -0
  252. package/src/pkg/commands/decr.ts +12 -0
  253. package/src/pkg/commands/decrby.ts +12 -0
  254. package/src/pkg/commands/del.ts +12 -0
  255. package/src/pkg/commands/echo.ts +12 -0
  256. package/src/pkg/commands/eval.ts +18 -0
  257. package/src/pkg/commands/evalRo.ts +18 -0
  258. package/src/pkg/commands/evalsha.ts +18 -0
  259. package/src/pkg/commands/evalshaRo.ts +18 -0
  260. package/src/pkg/commands/exec.ts +23 -0
  261. package/src/pkg/commands/exists.ts +12 -0
  262. package/src/pkg/commands/expire.ts +13 -0
  263. package/src/pkg/commands/expireat.ts +16 -0
  264. package/src/pkg/commands/fcall.ts +15 -0
  265. package/src/pkg/commands/fcall_ro.ts +18 -0
  266. package/src/pkg/commands/flushall.ts +15 -0
  267. package/src/pkg/commands/flushdb.ts +15 -0
  268. package/src/pkg/commands/function_delete.ts +12 -0
  269. package/src/pkg/commands/function_flush.ts +12 -0
  270. package/src/pkg/commands/function_list.ts +77 -0
  271. package/src/pkg/commands/function_load.ts +31 -0
  272. package/src/pkg/commands/function_stats.ts +42 -0
  273. package/src/pkg/commands/geo_add.ts +54 -0
  274. package/src/pkg/commands/geo_dist.ts +19 -0
  275. package/src/pkg/commands/geo_hash.ts +23 -0
  276. package/src/pkg/commands/geo_pos.ts +39 -0
  277. package/src/pkg/commands/geo_search.ts +140 -0
  278. package/src/pkg/commands/geo_search_store.ts +69 -0
  279. package/src/pkg/commands/get.ts +15 -0
  280. package/src/pkg/commands/getbit.ts +12 -0
  281. package/src/pkg/commands/getdel.ts +15 -0
  282. package/src/pkg/commands/getex.ts +36 -0
  283. package/src/pkg/commands/getrange.ts +15 -0
  284. package/src/pkg/commands/getset.ts +15 -0
  285. package/src/pkg/commands/hdel.ts +12 -0
  286. package/src/pkg/commands/hexists.ts +12 -0
  287. package/src/pkg/commands/hexpire.ts +30 -0
  288. package/src/pkg/commands/hexpireat.ts +30 -0
  289. package/src/pkg/commands/hexpiretime.ts +13 -0
  290. package/src/pkg/commands/hget.ts +18 -0
  291. package/src/pkg/commands/hgetall.ts +44 -0
  292. package/src/pkg/commands/hgetdel.ts +30 -0
  293. package/src/pkg/commands/hgetex.ts +56 -0
  294. package/src/pkg/commands/hincrby.ts +15 -0
  295. package/src/pkg/commands/hincrbyfloat.ts +15 -0
  296. package/src/pkg/commands/hkeys.ts +12 -0
  297. package/src/pkg/commands/hlen.ts +12 -0
  298. package/src/pkg/commands/hmget.ts +53 -0
  299. package/src/pkg/commands/hmset.ts +14 -0
  300. package/src/pkg/commands/hpersist.ts +13 -0
  301. package/src/pkg/commands/hpexpire.ts +30 -0
  302. package/src/pkg/commands/hpexpireat.ts +30 -0
  303. package/src/pkg/commands/hpexpiretime.ts +13 -0
  304. package/src/pkg/commands/hpttl.ts +13 -0
  305. package/src/pkg/commands/hrandfield.ts +52 -0
  306. package/src/pkg/commands/hscan.ts +31 -0
  307. package/src/pkg/commands/hset.ts +15 -0
  308. package/src/pkg/commands/hsetex.ts +59 -0
  309. package/src/pkg/commands/hsetnx.ts +15 -0
  310. package/src/pkg/commands/hstrlen.ts +12 -0
  311. package/src/pkg/commands/httl.ts +13 -0
  312. package/src/pkg/commands/hvals.ts +12 -0
  313. package/src/pkg/commands/incr.ts +12 -0
  314. package/src/pkg/commands/incrby.ts +12 -0
  315. package/src/pkg/commands/incrbyfloat.ts +12 -0
  316. package/src/pkg/commands/json_arrappend.ts +18 -0
  317. package/src/pkg/commands/json_arrindex.ts +15 -0
  318. package/src/pkg/commands/json_arrinsert.ts +18 -0
  319. package/src/pkg/commands/json_arrlen.ts +15 -0
  320. package/src/pkg/commands/json_arrpop.ts +15 -0
  321. package/src/pkg/commands/json_arrtrim.ts +19 -0
  322. package/src/pkg/commands/json_clear.ts +12 -0
  323. package/src/pkg/commands/json_del.ts +12 -0
  324. package/src/pkg/commands/json_forget.ts +12 -0
  325. package/src/pkg/commands/json_get.ts +45 -0
  326. package/src/pkg/commands/json_merge.ts +18 -0
  327. package/src/pkg/commands/json_mget.ts +12 -0
  328. package/src/pkg/commands/json_mset.ts +27 -0
  329. package/src/pkg/commands/json_numincrby.ts +15 -0
  330. package/src/pkg/commands/json_nummultby.ts +15 -0
  331. package/src/pkg/commands/json_objkeys.ts +15 -0
  332. package/src/pkg/commands/json_objlen.ts +15 -0
  333. package/src/pkg/commands/json_resp.ts +11 -0
  334. package/src/pkg/commands/json_set.ts +35 -0
  335. package/src/pkg/commands/json_strappend.ts +15 -0
  336. package/src/pkg/commands/json_strlen.ts +15 -0
  337. package/src/pkg/commands/json_toggle.ts +12 -0
  338. package/src/pkg/commands/json_type.ts +12 -0
  339. package/src/pkg/commands/keys.ts +12 -0
  340. package/src/pkg/commands/lindex.ts +11 -0
  341. package/src/pkg/commands/linsert.ts +10 -0
  342. package/src/pkg/commands/llen.ts +12 -0
  343. package/src/pkg/commands/lmove.ts +20 -0
  344. package/src/pkg/commands/lmpop.ts +19 -0
  345. package/src/pkg/commands/lpop.ts +18 -0
  346. package/src/pkg/commands/lpos.ts +26 -0
  347. package/src/pkg/commands/lpush.ts +12 -0
  348. package/src/pkg/commands/lpushx.ts +12 -0
  349. package/src/pkg/commands/lrange.ts +11 -0
  350. package/src/pkg/commands/lrem.ts +10 -0
  351. package/src/pkg/commands/lset.ts +8 -0
  352. package/src/pkg/commands/ltrim.ts +8 -0
  353. package/src/pkg/commands/mget.ts +15 -0
  354. package/src/pkg/commands/mod.ts +222 -0
  355. package/src/pkg/commands/mset.ts +12 -0
  356. package/src/pkg/commands/msetnx.ts +12 -0
  357. package/src/pkg/commands/persist.ts +12 -0
  358. package/src/pkg/commands/pexpire.ts +16 -0
  359. package/src/pkg/commands/pexpireat.ts +16 -0
  360. package/src/pkg/commands/pfadd.ts +11 -0
  361. package/src/pkg/commands/pfcount.ts +11 -0
  362. package/src/pkg/commands/pfmerge.ts +11 -0
  363. package/src/pkg/commands/ping.ts +15 -0
  364. package/src/pkg/commands/psetex.ts +14 -0
  365. package/src/pkg/commands/psubscribe.ts +26 -0
  366. package/src/pkg/commands/pttl.ts +12 -0
  367. package/src/pkg/commands/publish.ts +12 -0
  368. package/src/pkg/commands/randomkey.ts +12 -0
  369. package/src/pkg/commands/rename.ts +12 -0
  370. package/src/pkg/commands/renamenx.ts +12 -0
  371. package/src/pkg/commands/rpop.ts +21 -0
  372. package/src/pkg/commands/rpush.ts +12 -0
  373. package/src/pkg/commands/rpushx.ts +12 -0
  374. package/src/pkg/commands/sadd.ts +15 -0
  375. package/src/pkg/commands/scan.ts +63 -0
  376. package/src/pkg/commands/scard.ts +11 -0
  377. package/src/pkg/commands/script_exists.ts +15 -0
  378. package/src/pkg/commands/script_flush.ts +22 -0
  379. package/src/pkg/commands/script_load.ts +12 -0
  380. package/src/pkg/commands/sdiff.ts +11 -0
  381. package/src/pkg/commands/sdiffstore.ts +14 -0
  382. package/src/pkg/commands/search/command-builder.ts +162 -0
  383. package/src/pkg/commands/search/index.ts +4 -0
  384. package/src/pkg/commands/search/schema-builder.ts +320 -0
  385. package/src/pkg/commands/search/search.ts +218 -0
  386. package/src/pkg/commands/search/types.ts +1029 -0
  387. package/src/pkg/commands/search/utils.ts +275 -0
  388. package/src/pkg/commands/set.ts +52 -0
  389. package/src/pkg/commands/setbit.ts +15 -0
  390. package/src/pkg/commands/setex.ts +11 -0
  391. package/src/pkg/commands/setnx.ts +11 -0
  392. package/src/pkg/commands/setrange.ts +15 -0
  393. package/src/pkg/commands/sinter.ts +11 -0
  394. package/src/pkg/commands/sintercard.ts +19 -0
  395. package/src/pkg/commands/sinterstore.ts +14 -0
  396. package/src/pkg/commands/sismember.ts +11 -0
  397. package/src/pkg/commands/smembers.ts +12 -0
  398. package/src/pkg/commands/smismember.ts +17 -0
  399. package/src/pkg/commands/smove.ts +14 -0
  400. package/src/pkg/commands/spop.ts +18 -0
  401. package/src/pkg/commands/srandmember.ts +18 -0
  402. package/src/pkg/commands/srem.ts +11 -0
  403. package/src/pkg/commands/sscan.ts +31 -0
  404. package/src/pkg/commands/strlen.ts +12 -0
  405. package/src/pkg/commands/subscribe.ts +254 -0
  406. package/src/pkg/commands/sunion.ts +12 -0
  407. package/src/pkg/commands/sunionstore.ts +15 -0
  408. package/src/pkg/commands/time.ts +10 -0
  409. package/src/pkg/commands/touch.ts +12 -0
  410. package/src/pkg/commands/ttl.ts +12 -0
  411. package/src/pkg/commands/type.ts +13 -0
  412. package/src/pkg/commands/types.ts +201 -0
  413. package/src/pkg/commands/unlink.ts +12 -0
  414. package/src/pkg/commands/vector/index.ts +11 -0
  415. package/src/pkg/commands/vector/types.ts +63 -0
  416. package/src/pkg/commands/vector/utils.ts +67 -0
  417. package/src/pkg/commands/vector/vector.ts +131 -0
  418. package/src/pkg/commands/vector_add.ts +18 -0
  419. package/src/pkg/commands/vector_count.ts +11 -0
  420. package/src/pkg/commands/vector_create.ts +28 -0
  421. package/src/pkg/commands/vector_del.ts +13 -0
  422. package/src/pkg/commands/vector_drop.ts +13 -0
  423. package/src/pkg/commands/vector_get.ts +18 -0
  424. package/src/pkg/commands/vector_info.ts +25 -0
  425. package/src/pkg/commands/vector_query.ts +24 -0
  426. package/src/pkg/commands/xack.ts +16 -0
  427. package/src/pkg/commands/xackdel.ts +21 -0
  428. package/src/pkg/commands/xadd.ts +70 -0
  429. package/src/pkg/commands/xautoclaim.ts +31 -0
  430. package/src/pkg/commands/xclaim.ts +56 -0
  431. package/src/pkg/commands/xdel.ts +16 -0
  432. package/src/pkg/commands/xdelex.ts +25 -0
  433. package/src/pkg/commands/xgroup.ts +101 -0
  434. package/src/pkg/commands/xinfo.ts +28 -0
  435. package/src/pkg/commands/xlen.ts +12 -0
  436. package/src/pkg/commands/xpending.ts +44 -0
  437. package/src/pkg/commands/xrange.ts +49 -0
  438. package/src/pkg/commands/xread.ts +78 -0
  439. package/src/pkg/commands/xreadgroup.ts +74 -0
  440. package/src/pkg/commands/xrevrange.ts +48 -0
  441. package/src/pkg/commands/xtrim.ts +25 -0
  442. package/src/pkg/commands/zadd.ts +54 -0
  443. package/src/pkg/commands/zcard.ts +12 -0
  444. package/src/pkg/commands/zcount.ts +14 -0
  445. package/src/pkg/commands/zdiffstore.ts +15 -0
  446. package/src/pkg/commands/zincrby.ts +14 -0
  447. package/src/pkg/commands/zinterstore.ts +51 -0
  448. package/src/pkg/commands/zlexcount.ts +11 -0
  449. package/src/pkg/commands/zmscore.ts +16 -0
  450. package/src/pkg/commands/zpopmax.ts +18 -0
  451. package/src/pkg/commands/zpopmin.ts +18 -0
  452. package/src/pkg/commands/zrange.ts +72 -0
  453. package/src/pkg/commands/zrank.ts +14 -0
  454. package/src/pkg/commands/zrem.ts +11 -0
  455. package/src/pkg/commands/zremrangebylex.ts +11 -0
  456. package/src/pkg/commands/zremrangebyrank.ts +14 -0
  457. package/src/pkg/commands/zremrangebyscore.ts +18 -0
  458. package/src/pkg/commands/zrevrank.ts +14 -0
  459. package/src/pkg/commands/zscan.ts +31 -0
  460. package/src/pkg/commands/zscore.ts +15 -0
  461. package/src/pkg/commands/zunion.ts +54 -0
  462. package/src/pkg/commands/zunionstore.ts +52 -0
  463. package/src/pkg/error.ts +28 -0
  464. package/src/pkg/http.ts +458 -0
  465. package/src/pkg/index.ts +1 -0
  466. package/src/pkg/pipeline.ts +2041 -0
  467. package/src/pkg/redis.ts +2130 -0
  468. package/src/pkg/script.ts +100 -0
  469. package/src/pkg/scriptRo.ts +98 -0
  470. package/src/pkg/types.ts +35 -0
  471. package/src/pkg/util.ts +115 -0
  472. package/src/platforms/cloudflare.ts +162 -0
  473. package/src/platforms/fastly.ts +105 -0
  474. package/src/platforms/nodejs.ts +231 -0
  475. package/src/version.ts +1 -0
@@ -0,0 +1,12 @@
1
+ import type { CommandOptions } from "./command";
2
+ import { Command } from "./command";
3
+
4
+ /**
5
+ * @see https://redis.io/commands/echo
6
+ * @see node_modules/@upstash/redis/docs/commands/auth/echo.mdx
7
+ */
8
+ export class EchoCommand extends Command<string, string> {
9
+ constructor(cmd: [message: string], opts?: CommandOptions<string, string>) {
10
+ super(["echo", ...cmd], opts);
11
+ }
12
+ }
@@ -0,0 +1,18 @@
1
+ import type { CommandOptions } from "./command";
2
+ import { Command } from "./command";
3
+
4
+ /**
5
+ * @see https://redis.io/commands/eval
6
+ * @see node_modules/@upstash/redis/docs/commands/scripts/eval.mdx
7
+ * Responses are JSON-parsed automatically: a stored "123" comes back as the number 123, "true" as
8
+ * true, and '{"a":1}' as an object. Pass automaticDeserialization: false to the Redis constructor
9
+ * to receive raw strings.
10
+ */
11
+ export class EvalCommand<TArgs extends unknown[], TData> extends Command<unknown, TData> {
12
+ constructor(
13
+ [script, keys, args]: [script: string, keys: string[], args: TArgs],
14
+ opts?: CommandOptions<unknown, TData>
15
+ ) {
16
+ super(["eval", script, keys.length, ...keys, ...(args ?? [])], opts);
17
+ }
18
+ }
@@ -0,0 +1,18 @@
1
+ import type { CommandOptions } from "./command";
2
+ import { Command } from "./command";
3
+
4
+ /**
5
+ * @see https://redis.io/commands/eval_ro
6
+ * @see node_modules/@upstash/redis/docs/commands/scripts/eval_ro.mdx
7
+ * Responses are JSON-parsed automatically: a stored "123" comes back as the number 123, "true" as
8
+ * true, and '{"a":1}' as an object. Pass automaticDeserialization: false to the Redis constructor
9
+ * to receive raw strings.
10
+ */
11
+ export class EvalROCommand<TArgs extends unknown[], TData> extends Command<unknown, TData> {
12
+ constructor(
13
+ [script, keys, args]: [script: string, keys: string[], args: TArgs],
14
+ opts?: CommandOptions<unknown, TData>
15
+ ) {
16
+ super(["eval_ro", script, keys.length, ...keys, ...(args ?? [])], opts);
17
+ }
18
+ }
@@ -0,0 +1,18 @@
1
+ import type { CommandOptions } from "./command";
2
+ import { Command } from "./command";
3
+
4
+ /**
5
+ * @see https://redis.io/commands/evalsha
6
+ * @see node_modules/@upstash/redis/docs/commands/scripts/evalsha.mdx
7
+ * Responses are JSON-parsed automatically: a stored "123" comes back as the number 123, "true" as
8
+ * true, and '{"a":1}' as an object. Pass automaticDeserialization: false to the Redis constructor
9
+ * to receive raw strings.
10
+ */
11
+ export class EvalshaCommand<TArgs extends unknown[], TData> extends Command<unknown, TData> {
12
+ constructor(
13
+ [sha, keys, args]: [sha: string, keys: string[], args?: TArgs],
14
+ opts?: CommandOptions<unknown, TData>
15
+ ) {
16
+ super(["evalsha", sha, keys.length, ...keys, ...(args ?? [])], opts);
17
+ }
18
+ }
@@ -0,0 +1,18 @@
1
+ import type { CommandOptions } from "./command";
2
+ import { Command } from "./command";
3
+
4
+ /**
5
+ * @see https://redis.io/commands/evalsha_ro
6
+ * @see node_modules/@upstash/redis/docs/commands/scripts/evalsha_ro.mdx
7
+ * Responses are JSON-parsed automatically: a stored "123" comes back as the number 123, "true" as
8
+ * true, and '{"a":1}' as an object. Pass automaticDeserialization: false to the Redis constructor
9
+ * to receive raw strings.
10
+ */
11
+ export class EvalshaROCommand<TArgs extends unknown[], TData> extends Command<unknown, TData> {
12
+ constructor(
13
+ [sha, keys, args]: [sha: string, keys: string[], args?: TArgs],
14
+ opts?: CommandOptions<unknown, TData>
15
+ ) {
16
+ super(["evalsha_ro", sha, keys.length, ...keys, ...(args ?? [])], opts);
17
+ }
18
+ }
@@ -0,0 +1,23 @@
1
+ import { type CommandOptions, Command } from "./command";
2
+
3
+ /**
4
+ * Generic exec command for executing arbitrary Redis commands
5
+ * Allows executing Redis commands that might not be directly supported by the SDK
6
+ *
7
+ * @example
8
+ * // Execute MEMORY USAGE command
9
+ * await redis.exec<number>("MEMORY", "USAGE", "myKey")
10
+ *
11
+ * // Execute GET command
12
+ * await redis.exec<string>("GET", "foo")
13
+ */
14
+
15
+ export class ExecCommand<TResult> extends Command<TResult, TResult> {
16
+ constructor(
17
+ cmd: [command: string, ...args: (string | number | boolean)[]],
18
+ opts?: CommandOptions<TResult, TResult>
19
+ ) {
20
+ const normalizedCmd = cmd.map((arg) => (typeof arg === "string" ? arg : String(arg)));
21
+ super(normalizedCmd, opts);
22
+ }
23
+ }
@@ -0,0 +1,12 @@
1
+ import type { CommandOptions } from "./command";
2
+ import { Command } from "./command";
3
+
4
+ /**
5
+ * @see https://redis.io/commands/exists
6
+ * @see node_modules/@upstash/redis/docs/commands/generic/exists.mdx
7
+ */
8
+ export class ExistsCommand extends Command<number, number> {
9
+ constructor(cmd: [...keys: string[]], opts?: CommandOptions<number, number>) {
10
+ super(["exists", ...cmd], opts);
11
+ }
12
+ }
@@ -0,0 +1,13 @@
1
+ import type { CommandOptions } from "./command";
2
+ import { Command } from "./command";
3
+
4
+ export type ExpireOption = "NX" | "nx" | "XX" | "xx" | "GT" | "gt" | "LT" | "lt";
5
+
6
+ export class ExpireCommand extends Command<"0" | "1", 0 | 1> {
7
+ constructor(
8
+ cmd: [key: string, seconds: number, option?: ExpireOption],
9
+ opts?: CommandOptions<"0" | "1", 0 | 1>
10
+ ) {
11
+ super(["expire", ...cmd.filter(Boolean)], opts);
12
+ }
13
+ }
@@ -0,0 +1,16 @@
1
+ import type { CommandOptions } from "./command";
2
+ import { Command } from "./command";
3
+ import type { ExpireOption } from "./expire";
4
+
5
+ /**
6
+ * @see https://redis.io/commands/expireat
7
+ * @see node_modules/@upstash/redis/docs/commands/generic/expireat.mdx
8
+ */
9
+ export class ExpireAtCommand extends Command<"0" | "1", 0 | 1> {
10
+ constructor(
11
+ cmd: [key: string, unix: number, option?: ExpireOption],
12
+ opts?: CommandOptions<"0" | "1", 0 | 1>
13
+ ) {
14
+ super(["expireat", ...cmd], opts);
15
+ }
16
+ }
@@ -0,0 +1,15 @@
1
+ import type { CommandOptions } from "./command";
2
+ import { Command } from "./command";
3
+
4
+ /**
5
+ * @see https://redis.io/docs/latest/commands/fcall/
6
+ * @see node_modules/@upstash/redis/docs/commands/functions/call.mdx
7
+ */
8
+ export class FCallCommand<TData> extends Command<unknown, TData> {
9
+ constructor(
10
+ [functionName, keys, args]: [functionName: string, keys?: string[], args?: string[]],
11
+ opts?: CommandOptions<unknown, TData>
12
+ ) {
13
+ super(["fcall", functionName, ...(keys ? [keys.length, ...keys] : [0]), ...(args ?? [])], opts);
14
+ }
15
+ }
@@ -0,0 +1,18 @@
1
+ import type { CommandOptions } from "./command";
2
+ import { Command } from "./command";
3
+
4
+ /**
5
+ * @see https://redis.io/docs/latest/commands/fcall_ro/
6
+ * @see node_modules/@upstash/redis/docs/commands/functions/call_ro.mdx
7
+ */
8
+ export class FCallRoCommand<TData> extends Command<unknown, TData> {
9
+ constructor(
10
+ [functionName, keys, args]: [functionName: string, keys?: string[], args?: string[]],
11
+ opts?: CommandOptions<unknown, TData>
12
+ ) {
13
+ super(
14
+ ["fcall_ro", functionName, ...(keys ? [keys.length, ...keys] : [0]), ...(args ?? [])],
15
+ opts
16
+ );
17
+ }
18
+ }
@@ -0,0 +1,15 @@
1
+ import type { CommandOptions } from "./command";
2
+ import { Command } from "./command";
3
+ /**
4
+ * @see https://redis.io/commands/flushall
5
+ * @see node_modules/@upstash/redis/docs/commands/server/flushall.mdx
6
+ */
7
+ export class FlushAllCommand extends Command<"OK", "OK"> {
8
+ constructor(args?: [{ async?: boolean }], opts?: CommandOptions<"OK", "OK">) {
9
+ const command = ["flushall"];
10
+ if (args && args.length > 0 && args[0].async) {
11
+ command.push("async");
12
+ }
13
+ super(command, opts);
14
+ }
15
+ }
@@ -0,0 +1,15 @@
1
+ import type { CommandOptions } from "./command";
2
+ import { Command } from "./command";
3
+ /**
4
+ * @see https://redis.io/commands/flushdb
5
+ * @see node_modules/@upstash/redis/docs/commands/server/flushdb.mdx
6
+ */
7
+ export class FlushDBCommand extends Command<"OK", "OK"> {
8
+ constructor([opts]: [opts?: { async?: boolean }], cmdOpts?: CommandOptions<"OK", "OK">) {
9
+ const command = ["flushdb"];
10
+ if (opts?.async) {
11
+ command.push("async");
12
+ }
13
+ super(command, cmdOpts);
14
+ }
15
+ }
@@ -0,0 +1,12 @@
1
+ import type { CommandOptions } from "./command";
2
+ import { Command } from "./command";
3
+
4
+ /**
5
+ * @see https://redis.io/docs/latest/commands/function-delete/
6
+ * @see node_modules/@upstash/redis/docs/commands/functions/delete.mdx
7
+ */
8
+ export class FunctionDeleteCommand extends Command<"OK", "OK"> {
9
+ constructor([libraryName]: [libraryName: string], opts?: CommandOptions<"OK", "OK">) {
10
+ super(["function", "delete", libraryName], opts);
11
+ }
12
+ }
@@ -0,0 +1,12 @@
1
+ import type { CommandOptions } from "./command";
2
+ import { Command } from "./command";
3
+
4
+ /**
5
+ * @see https://redis.io/docs/latest/commands/function-flush/
6
+ * @see node_modules/@upstash/redis/docs/commands/functions/flush.mdx
7
+ */
8
+ export class FunctionFlushCommand extends Command<"OK", "OK"> {
9
+ constructor(opts?: CommandOptions<"OK", "OK">) {
10
+ super(["function", "flush"], opts);
11
+ }
12
+ }
@@ -0,0 +1,77 @@
1
+ import { kvArrayToObject } from "../util";
2
+ import type { CommandOptions } from "./command";
3
+ import { Command } from "./command";
4
+
5
+ export type FunctionListArgs = {
6
+ /**
7
+ * Pattern for matching library names. Supports glob patterns.
8
+ *
9
+ * Example: "my_library_*"
10
+ */
11
+ libraryName?: string;
12
+ /**
13
+ * Includes the library source code in the response.
14
+ *
15
+ * @default false
16
+ */
17
+ withCode?: boolean;
18
+ };
19
+
20
+ type RedisFunctionLibrary = {
21
+ libraryName: string;
22
+ engine: string;
23
+ functions: {
24
+ name: string;
25
+ description?: string;
26
+ flags: string[];
27
+ }[];
28
+ libraryCode?: string;
29
+ };
30
+
31
+ /**
32
+ * @see https://redis.io/docs/latest/commands/function-list/
33
+ * @see node_modules/@upstash/redis/docs/commands/functions/list.mdx
34
+ */
35
+ export class FunctionListCommand extends Command<unknown, RedisFunctionLibrary[]> {
36
+ constructor(
37
+ [args]: [args?: FunctionListArgs],
38
+ opts?: CommandOptions<unknown, RedisFunctionLibrary[]>
39
+ ) {
40
+ const command: (string | number | boolean)[] = ["function", "list"];
41
+ if (args?.libraryName) {
42
+ command.push("libraryname", args.libraryName);
43
+ }
44
+ if (args?.withCode) {
45
+ command.push("withcode");
46
+ }
47
+ super(command, { deserialize, ...opts });
48
+ }
49
+ }
50
+
51
+ function deserialize(result: unknown): RedisFunctionLibrary[] {
52
+ if (!Array.isArray(result)) return [];
53
+
54
+ return result.map((libRaw) => {
55
+ const lib = kvArrayToObject<{
56
+ library_name: string;
57
+ engine: string;
58
+ functions: unknown[];
59
+ library_code: string;
60
+ }>(libRaw);
61
+
62
+ const functionsParsed = lib.functions.map((fnRaw) =>
63
+ kvArrayToObject<{ name: string; description: string | null; flags: string[] }>(fnRaw)
64
+ );
65
+
66
+ return {
67
+ libraryName: lib.library_name,
68
+ engine: lib.engine,
69
+ functions: functionsParsed.map((fn) => ({
70
+ name: fn.name,
71
+ description: fn.description ?? undefined,
72
+ flags: fn.flags,
73
+ })),
74
+ libraryCode: lib.library_code,
75
+ };
76
+ });
77
+ }
@@ -0,0 +1,31 @@
1
+ import type { CommandOptions } from "./command";
2
+ import { Command } from "./command";
3
+
4
+ export type FunctionLoadArgs = {
5
+ /**
6
+ * The Lua code to load.
7
+ *
8
+ * Example:
9
+ * ```lua
10
+ * #!lua name=mylib
11
+ * redis.register_function('myfunc', function() return 'ok' end)
12
+ * ```
13
+ */
14
+ code: string;
15
+ /**
16
+ * If true, the library will replace the existing library with the same name.
17
+ *
18
+ * @default false
19
+ */
20
+ replace?: boolean;
21
+ };
22
+
23
+ /**
24
+ * @see https://redis.io/docs/latest/commands/function-load/
25
+ * @see node_modules/@upstash/redis/docs/commands/functions/load.mdx
26
+ */
27
+ export class FunctionLoadCommand extends Command<string, string> {
28
+ constructor([args]: [args: FunctionLoadArgs], opts?: CommandOptions<string, string>) {
29
+ super(["function", "load", ...(args.replace ? ["replace"] : []), args.code], opts);
30
+ }
31
+ }
@@ -0,0 +1,42 @@
1
+ import { kvArrayToObject } from "../util";
2
+ import type { CommandOptions } from "./command";
3
+ import { Command } from "./command";
4
+
5
+ type RedisFunctionStats = ReturnType<typeof deserialize>;
6
+
7
+ /**
8
+ * @see https://redis.io/docs/latest/commands/function-stats/
9
+ * @see node_modules/@upstash/redis/docs/commands/functions/stats.mdx
10
+ *
11
+ * Note: `running_script` is always null in Upstash and therefore not included in the type.
12
+ */
13
+ export class FunctionStatsCommand extends Command<unknown, RedisFunctionStats> {
14
+ constructor(opts?: CommandOptions<unknown, RedisFunctionStats>) {
15
+ super(["function", "stats"], { deserialize, ...opts });
16
+ }
17
+ }
18
+
19
+ function deserialize(result: unknown) {
20
+ // Object of { engines: { LUA: [k1, v1, k2, v2, ...] }}
21
+ const rawEngines = kvArrayToObject(kvArrayToObject(result).engines);
22
+
23
+ // Parses inside LUA: [k1, v1 ...] into LUA: { libraries_count: v1, functions_count: v2 }
24
+ const parsedEngines = Object.fromEntries(
25
+ Object.entries(rawEngines).map(([key, value]) => [key, kvArrayToObject(value)])
26
+ );
27
+
28
+ // Converts to camelCased keys
29
+ const final = {
30
+ engines: Object.fromEntries(
31
+ Object.entries(parsedEngines).map(([key, value]) => [
32
+ key,
33
+ {
34
+ librariesCount: value.libraries_count,
35
+ functionsCount: value.functions_count,
36
+ },
37
+ ])
38
+ ),
39
+ };
40
+
41
+ return final;
42
+ }
@@ -0,0 +1,54 @@
1
+ import type { CommandOptions } from "./command";
2
+ import { Command } from "./command";
3
+
4
+ export type GeoAddCommandOptions =
5
+ | {
6
+ nx?: boolean;
7
+ xx?: never;
8
+ }
9
+ | ({
10
+ nx?: never;
11
+ xx?: boolean;
12
+ } & { ch?: boolean });
13
+
14
+ export type GeoMember<TMemberType> = {
15
+ latitude: number;
16
+ longitude: number;
17
+ member: TMemberType;
18
+ };
19
+
20
+ /**
21
+ * @see https://redis.io/commands/geoadd
22
+ */
23
+ export class GeoAddCommand<TMemberType = string> extends Command<number | null, number | null> {
24
+ constructor(
25
+ [key, arg1, ...arg2]: [
26
+ string,
27
+ GeoMember<TMemberType> | GeoAddCommandOptions,
28
+ ...GeoMember<TMemberType>[],
29
+ ],
30
+ opts?: CommandOptions<number | null, number | null>
31
+ ) {
32
+ const command: unknown[] = ["geoadd", key];
33
+
34
+ if ("nx" in arg1 && arg1.nx) {
35
+ command.push("nx");
36
+ } else if ("xx" in arg1 && arg1.xx) {
37
+ command.push("xx");
38
+ }
39
+
40
+ if ("ch" in arg1 && arg1.ch) {
41
+ command.push("ch");
42
+ }
43
+
44
+ if ("latitude" in arg1 && arg1.latitude) {
45
+ command.push(arg1.longitude, arg1.latitude, arg1.member);
46
+ }
47
+
48
+ command.push(
49
+ ...arg2.flatMap(({ latitude, longitude, member }) => [longitude, latitude, member])
50
+ );
51
+
52
+ super(command, opts);
53
+ }
54
+ }
@@ -0,0 +1,19 @@
1
+ import type { CommandOptions } from "./command";
2
+ import { Command } from "./command";
3
+
4
+ /**
5
+ * @see https://redis.io/commands/geodist
6
+ */
7
+ export class GeoDistCommand<TMemberType = string> extends Command<number | null, number | null> {
8
+ constructor(
9
+ [key, member1, member2, unit = "M"]: [
10
+ key: string,
11
+ member1: TMemberType,
12
+ member2: TMemberType,
13
+ unit?: "M" | "KM" | "FT" | "MI",
14
+ ],
15
+ opts?: CommandOptions<number | null, number | null>
16
+ ) {
17
+ super(["GEODIST", key, member1, member2, unit], opts);
18
+ }
19
+ }
@@ -0,0 +1,23 @@
1
+ import type { CommandOptions } from "./command.ts";
2
+ import { Command } from "./command.ts";
3
+
4
+ /**
5
+ * @see https://redis.io/commands/geohash
6
+ */
7
+ export class GeoHashCommand<TMember = string> extends Command<
8
+ (string | null)[],
9
+ (string | null)[]
10
+ > {
11
+ constructor(
12
+ cmd: [string, ...TMember[]],
13
+ opts?: CommandOptions<(string | null)[], (string | null)[]>
14
+ ) {
15
+ const [key] = cmd;
16
+ // Check if the second argument is an array of strings (members).
17
+ // If it is, use it directly; if not, it means the members were passed individually,
18
+ // so we slice the cmd from the second element onwards to get the members.
19
+ const members = Array.isArray(cmd[1]) ? cmd[1] : cmd.slice(1);
20
+
21
+ super(["GEOHASH", key, ...members], opts);
22
+ }
23
+ }
@@ -0,0 +1,39 @@
1
+ import type { CommandOptions } from "./command.ts";
2
+ import { Command } from "./command.ts";
3
+
4
+ type Coordinates = {
5
+ lng: number;
6
+ lat: number;
7
+ };
8
+
9
+ /**
10
+ * @see https://redis.io/commands/geopos
11
+ */
12
+ export class GeoPosCommand<TMember = string> extends Command<(string | null)[][], Coordinates[]> {
13
+ constructor(
14
+ cmd: [string, ...(TMember[] | TMember[])],
15
+ opts?: CommandOptions<(string | null)[][], Coordinates[]>
16
+ ) {
17
+ const [key] = cmd;
18
+ // Check if the second argument is an array of strings (members).
19
+ // If it is, use it directly; if not, it means the members were passed individually,
20
+ // so we slice the cmd from the second element onwards to get the members.
21
+ const members = Array.isArray(cmd[1]) ? cmd[1] : cmd.slice(1);
22
+
23
+ super(["GEOPOS", key, ...members], {
24
+ deserialize: (result) => transform(result),
25
+ ...opts,
26
+ });
27
+ }
28
+ }
29
+
30
+ function transform(result: (string | null)[][]): Coordinates[] {
31
+ const final: Coordinates[] = [];
32
+ for (const pos of result) {
33
+ if (!pos?.[0] || !pos?.[1]) {
34
+ continue;
35
+ }
36
+ final.push({ lng: Number.parseFloat(pos[0]), lat: Number.parseFloat(pos[1]) });
37
+ }
38
+ return final;
39
+ }