@upstash/redis 1.0.0-alpha.2 → 1.0.0-alpha.7

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 (268) hide show
  1. package/README.md +256 -0
  2. package/{dist/chunk-7YUZYRJS.mjs → chunk-7YUZYRJS.mjs} +0 -0
  3. package/{dist/chunk-FJSI5EBJ.mjs → chunk-AHCVU33N.mjs} +2 -2
  4. package/{dist/chunk-ZIB6XPPC.mjs → chunk-HGM7M7CJ.mjs} +9 -4
  5. package/{dist/chunk-U7OXAQMQ.mjs → chunk-HIDCSH5S.mjs} +0 -1
  6. package/{dist/chunk-Y5TC4HX2.mjs → chunk-T66TTHSV.mjs} +5 -5
  7. package/{dist/cloudflare.d.ts → cloudflare.d.ts} +2 -2
  8. package/{dist/cloudflare.js → cloudflare.js} +12 -9
  9. package/{dist/cloudflare.mjs → cloudflare.mjs} +3 -3
  10. package/{dist/commands.d.ts → commands.d.ts} +5 -3
  11. package/{dist/commands.js → commands.js} +10 -4
  12. package/{dist/commands.mjs → commands.mjs} +3 -1
  13. package/{dist/fastly.d.ts → fastly.d.ts} +2 -2
  14. package/{dist/fastly.js → fastly.js} +12 -9
  15. package/{dist/fastly.mjs → fastly.mjs} +3 -3
  16. package/{dist/http.d.ts → http.d.ts} +0 -0
  17. package/{dist/http.js → http.js} +0 -1
  18. package/{dist/http.mjs → http.mjs} +1 -1
  19. package/{dist/index.d.ts → index.d.ts} +2 -2
  20. package/{dist/index.js → index.js} +13 -10
  21. package/index.mjs +13 -0
  22. package/{dist/nodejs.d.ts → nodejs.d.ts} +2 -2
  23. package/{dist/nodejs.js → nodejs.js} +13 -10
  24. package/nodejs.mjs +10 -0
  25. package/package.json +1 -1
  26. package/{dist/redis-dd052782.d.ts → redis-71fa1ee6.d.ts} +7 -3
  27. package/{dist/zunionstore-dffa797d.d.ts → zunionstore-b38007ba.d.ts} +1 -1
  28. package/.eslintrc.js +0 -49
  29. package/.prettierrc.js +0 -7
  30. package/LICENSE +0 -21
  31. package/dist/index.mjs +0 -13
  32. package/dist/nodejs.mjs +0 -10
  33. package/dist/package.json +0 -1
  34. package/jest.config.js +0 -195
  35. package/pkg/cloudflare.ts +0 -77
  36. package/pkg/command.ts +0 -40
  37. package/pkg/commands/append.test.ts +0 -28
  38. package/pkg/commands/append.ts +0 -10
  39. package/pkg/commands/bitcount.test.ts +0 -36
  40. package/pkg/commands/bitcount.ts +0 -19
  41. package/pkg/commands/bitop.test.ts +0 -44
  42. package/pkg/commands/bitop.ts +0 -22
  43. package/pkg/commands/bitpos.test.ts +0 -26
  44. package/pkg/commands/bitpos.ts +0 -10
  45. package/pkg/commands/dbsize.test.ts +0 -17
  46. package/pkg/commands/dbsize.ts +0 -10
  47. package/pkg/commands/decr.test.ts +0 -22
  48. package/pkg/commands/decr.ts +0 -10
  49. package/pkg/commands/decrby.test.ts +0 -23
  50. package/pkg/commands/decrby.ts +0 -10
  51. package/pkg/commands/del.test.ts +0 -38
  52. package/pkg/commands/del.ts +0 -11
  53. package/pkg/commands/echo.test.ts +0 -11
  54. package/pkg/commands/echo.ts +0 -10
  55. package/pkg/commands/exists.test.ts +0 -37
  56. package/pkg/commands/exists.ts +0 -11
  57. package/pkg/commands/expire.test.ts +0 -22
  58. package/pkg/commands/expire.ts +0 -10
  59. package/pkg/commands/expireat.test.ts +0 -24
  60. package/pkg/commands/expireat.ts +0 -10
  61. package/pkg/commands/flushall.test.ts +0 -17
  62. package/pkg/commands/flushall.ts +0 -13
  63. package/pkg/commands/flushdb.test.ts +0 -17
  64. package/pkg/commands/flushdb.ts +0 -13
  65. package/pkg/commands/get.test.ts +0 -34
  66. package/pkg/commands/get.ts +0 -10
  67. package/pkg/commands/getbit.test.ts +0 -16
  68. package/pkg/commands/getbit.ts +0 -10
  69. package/pkg/commands/getrange.test.ts +0 -25
  70. package/pkg/commands/getrange.ts +0 -10
  71. package/pkg/commands/getset.test.ts +0 -33
  72. package/pkg/commands/getset.ts +0 -10
  73. package/pkg/commands/hdel.test.ts +0 -30
  74. package/pkg/commands/hdel.ts +0 -10
  75. package/pkg/commands/hexists.test.ts +0 -31
  76. package/pkg/commands/hexists.ts +0 -10
  77. package/pkg/commands/hget.test.ts +0 -47
  78. package/pkg/commands/hget.ts +0 -10
  79. package/pkg/commands/hgetall.test.ts +0 -32
  80. package/pkg/commands/hgetall.ts +0 -35
  81. package/pkg/commands/hincrby.test.ts +0 -27
  82. package/pkg/commands/hincrby.ts +0 -10
  83. package/pkg/commands/hincrbyfloat.test.ts +0 -25
  84. package/pkg/commands/hincrbyfloat.ts +0 -10
  85. package/pkg/commands/hkeys.test.ts +0 -22
  86. package/pkg/commands/hkeys.ts +0 -10
  87. package/pkg/commands/hlen.test.ts +0 -24
  88. package/pkg/commands/hlen.ts +0 -10
  89. package/pkg/commands/hmget.test.ts +0 -48
  90. package/pkg/commands/hmget.ts +0 -41
  91. package/pkg/commands/hmset.test.ts +0 -24
  92. package/pkg/commands/hmset.ts +0 -10
  93. package/pkg/commands/hscan.test.ts +0 -46
  94. package/pkg/commands/hscan.ts +0 -22
  95. package/pkg/commands/hset.test.ts +0 -21
  96. package/pkg/commands/hset.ts +0 -10
  97. package/pkg/commands/hsetnx.test.ts +0 -37
  98. package/pkg/commands/hsetnx.ts +0 -10
  99. package/pkg/commands/hstrlen.test.ts +0 -24
  100. package/pkg/commands/hstrlen.ts +0 -10
  101. package/pkg/commands/hvals.test.ts +0 -23
  102. package/pkg/commands/hvals.ts +0 -10
  103. package/pkg/commands/incr.test.ts +0 -23
  104. package/pkg/commands/incr.ts +0 -10
  105. package/pkg/commands/incrby.test.ts +0 -23
  106. package/pkg/commands/incrby.ts +0 -10
  107. package/pkg/commands/incrbyfloat.test.ts +0 -24
  108. package/pkg/commands/incrbyfloat.ts +0 -10
  109. package/pkg/commands/index.ts +0 -107
  110. package/pkg/commands/keys.test.ts +0 -17
  111. package/pkg/commands/keys.ts +0 -10
  112. package/pkg/commands/lindex.test.ts +0 -33
  113. package/pkg/commands/lindex.ts +0 -7
  114. package/pkg/commands/linsert.test.ts +0 -19
  115. package/pkg/commands/linsert.ts +0 -6
  116. package/pkg/commands/llen.test.ts +0 -26
  117. package/pkg/commands/llen.ts +0 -10
  118. package/pkg/commands/lpop.test.ts +0 -27
  119. package/pkg/commands/lpop.ts +0 -10
  120. package/pkg/commands/lpush.test.ts +0 -17
  121. package/pkg/commands/lpush.ts +0 -11
  122. package/pkg/commands/lpushx.test.ts +0 -29
  123. package/pkg/commands/lpushx.ts +0 -11
  124. package/pkg/commands/lrange.test.ts +0 -22
  125. package/pkg/commands/lrange.ts +0 -7
  126. package/pkg/commands/lrem.test.ts +0 -19
  127. package/pkg/commands/lrem.ts +0 -6
  128. package/pkg/commands/lset.test.ts +0 -40
  129. package/pkg/commands/lset.ts +0 -7
  130. package/pkg/commands/ltrim.test.ts +0 -29
  131. package/pkg/commands/ltrim.ts +0 -7
  132. package/pkg/commands/mget.test.ts +0 -44
  133. package/pkg/commands/mget.ts +0 -9
  134. package/pkg/commands/mset.test.ts +0 -24
  135. package/pkg/commands/mset.ts +0 -10
  136. package/pkg/commands/msetnx.test.ts +0 -46
  137. package/pkg/commands/msetnx.ts +0 -10
  138. package/pkg/commands/persist.test.ts +0 -22
  139. package/pkg/commands/persist.ts +0 -10
  140. package/pkg/commands/pexpire.test.ts +0 -24
  141. package/pkg/commands/pexpire.ts +0 -10
  142. package/pkg/commands/pexpireat.test.ts +0 -24
  143. package/pkg/commands/pexpireat.ts +0 -10
  144. package/pkg/commands/ping.test.ts +0 -19
  145. package/pkg/commands/ping.ts +0 -13
  146. package/pkg/commands/psetex.test.ts +0 -23
  147. package/pkg/commands/psetex.ts +0 -10
  148. package/pkg/commands/pttl.test.ts +0 -17
  149. package/pkg/commands/pttl.ts +0 -10
  150. package/pkg/commands/randomkey.test.ts +0 -17
  151. package/pkg/commands/randomkey.ts +0 -10
  152. package/pkg/commands/rename.test.ts +0 -18
  153. package/pkg/commands/rename.ts +0 -10
  154. package/pkg/commands/renamenx.test.ts +0 -32
  155. package/pkg/commands/renamenx.ts +0 -10
  156. package/pkg/commands/rpop.test.ts +0 -27
  157. package/pkg/commands/rpop.ts +0 -10
  158. package/pkg/commands/rpush.test.ts +0 -17
  159. package/pkg/commands/rpush.ts +0 -11
  160. package/pkg/commands/rpushx.test.ts +0 -29
  161. package/pkg/commands/rpushx.ts +0 -11
  162. package/pkg/commands/sadd.test.ts +0 -16
  163. package/pkg/commands/sadd.ts +0 -11
  164. package/pkg/commands/scan.test.ts +0 -50
  165. package/pkg/commands/scan.ts +0 -21
  166. package/pkg/commands/scard.test.ts +0 -15
  167. package/pkg/commands/scard.ts +0 -9
  168. package/pkg/commands/sdiff.test.ts +0 -20
  169. package/pkg/commands/sdiff.ts +0 -9
  170. package/pkg/commands/sdiffstore.test.ts +0 -21
  171. package/pkg/commands/sdiffstore.ts +0 -10
  172. package/pkg/commands/set.test.ts +0 -112
  173. package/pkg/commands/set.ts +0 -53
  174. package/pkg/commands/setbit.test.ts +0 -16
  175. package/pkg/commands/setbit.ts +0 -10
  176. package/pkg/commands/setex.test.ts +0 -22
  177. package/pkg/commands/setex.ts +0 -10
  178. package/pkg/commands/setnx.test.ts +0 -27
  179. package/pkg/commands/setnx.ts +0 -10
  180. package/pkg/commands/setrange.test.ts +0 -25
  181. package/pkg/commands/setrange.ts +0 -10
  182. package/pkg/commands/sinter.test.ts +0 -36
  183. package/pkg/commands/sinter.ts +0 -9
  184. package/pkg/commands/sinterstore.test.ts +0 -21
  185. package/pkg/commands/sinterstore.ts +0 -9
  186. package/pkg/commands/sismember.test.ts +0 -30
  187. package/pkg/commands/sismember.ts +0 -9
  188. package/pkg/commands/smembers.test.ts +0 -22
  189. package/pkg/commands/smembers.ts +0 -10
  190. package/pkg/commands/smove.test.ts +0 -18
  191. package/pkg/commands/smove.ts +0 -9
  192. package/pkg/commands/spop.test.ts +0 -35
  193. package/pkg/commands/spop.ts +0 -13
  194. package/pkg/commands/srandmember.test.ts +0 -32
  195. package/pkg/commands/srandmember.ts +0 -13
  196. package/pkg/commands/srem.test.ts +0 -18
  197. package/pkg/commands/srem.ts +0 -10
  198. package/pkg/commands/sscan.test.ts +0 -50
  199. package/pkg/commands/sscan.ts +0 -22
  200. package/pkg/commands/strlen.test.ts +0 -16
  201. package/pkg/commands/strlen.ts +0 -10
  202. package/pkg/commands/sunion.test.ts +0 -22
  203. package/pkg/commands/sunion.ts +0 -10
  204. package/pkg/commands/sunionstore.test.ts +0 -29
  205. package/pkg/commands/sunionstore.ts +0 -10
  206. package/pkg/commands/time.test.ts +0 -11
  207. package/pkg/commands/time.ts +0 -9
  208. package/pkg/commands/touch.test.ts +0 -20
  209. package/pkg/commands/touch.ts +0 -10
  210. package/pkg/commands/ttl.test.ts +0 -17
  211. package/pkg/commands/ttl.ts +0 -10
  212. package/pkg/commands/type.test.ts +0 -72
  213. package/pkg/commands/type.ts +0 -11
  214. package/pkg/commands/unlink.test.ts +0 -21
  215. package/pkg/commands/unlink.ts +0 -10
  216. package/pkg/commands/zadd.test.ts +0 -177
  217. package/pkg/commands/zadd.ts +0 -64
  218. package/pkg/commands/zcard.test.ts +0 -15
  219. package/pkg/commands/zcard.ts +0 -10
  220. package/pkg/commands/zcount.test.ts +0 -15
  221. package/pkg/commands/zcount.ts +0 -9
  222. package/pkg/commands/zincrby.test.ts +0 -20
  223. package/pkg/commands/zincrby.ts +0 -9
  224. package/pkg/commands/zinterstore.test.ts +0 -239
  225. package/pkg/commands/zinterstore.ts +0 -55
  226. package/pkg/commands/zlexcount.test.ts +0 -22
  227. package/pkg/commands/zlexcount.ts +0 -9
  228. package/pkg/commands/zpopmax.test.ts +0 -45
  229. package/pkg/commands/zpopmax.ts +0 -13
  230. package/pkg/commands/zpopmin.test.ts +0 -49
  231. package/pkg/commands/zpopmin.ts +0 -13
  232. package/pkg/commands/zrange.test.ts +0 -52
  233. package/pkg/commands/zrange.ts +0 -22
  234. package/pkg/commands/zrank.test.ts +0 -22
  235. package/pkg/commands/zrank.ts +0 -10
  236. package/pkg/commands/zrem.test.ts +0 -20
  237. package/pkg/commands/zrem.ts +0 -10
  238. package/pkg/commands/zremrangebylex.test.ts +0 -26
  239. package/pkg/commands/zremrangebylex.ts +0 -9
  240. package/pkg/commands/zremrangebyrank.test.ts +0 -27
  241. package/pkg/commands/zremrangebyrank.ts +0 -9
  242. package/pkg/commands/zremrangebyscore.test.ts +0 -24
  243. package/pkg/commands/zremrangebyscore.ts +0 -9
  244. package/pkg/commands/zrevrank.test.ts +0 -22
  245. package/pkg/commands/zrevrank.ts +0 -10
  246. package/pkg/commands/zscan.test.ts +0 -50
  247. package/pkg/commands/zscan.ts +0 -22
  248. package/pkg/commands/zscore.test.ts +0 -18
  249. package/pkg/commands/zscore.ts +0 -10
  250. package/pkg/commands/zunionstore.test.ts +0 -215
  251. package/pkg/commands/zunionstore.ts +0 -55
  252. package/pkg/commands/zz.ts +0 -1
  253. package/pkg/error.ts +0 -9
  254. package/pkg/fastly.ts +0 -54
  255. package/pkg/http.test.ts +0 -34
  256. package/pkg/http.ts +0 -62
  257. package/pkg/index.ts +0 -2
  258. package/pkg/nodejs.ts +0 -83
  259. package/pkg/pipeline.test.ts +0 -177
  260. package/pkg/pipeline.ts +0 -999
  261. package/pkg/redis.ts +0 -930
  262. package/pkg/test-utils.ts +0 -41
  263. package/pkg/types.ts +0 -4
  264. package/pkg/util.ts +0 -22
  265. package/pnpm-lock.yaml +0 -3940
  266. package/tsconfig.json +0 -100
  267. package/tsconfig.module.json +0 -8
  268. package/tsup.config.ts +0 -16
@@ -1,25 +0,0 @@
1
- import { keygen, newHttpClient } from "../test-utils"
2
- import { it, expect, afterAll } from "@jest/globals"
3
- import { GetRangeCommand } from "./getrange"
4
- import { SetCommand } from "./set"
5
- const client = newHttpClient()
6
-
7
- const { newKey, cleanup } = keygen()
8
- afterAll(cleanup)
9
-
10
- it("gets an exiting value", async () => {
11
- const key = newKey()
12
- const value = "Hello World"
13
- await new SetCommand(key, value).exec(client)
14
- const res = await new GetRangeCommand(key, 2, 4).exec(client)
15
-
16
- expect(res).toBeDefined()
17
- expect(res!).toEqual(value.slice(2, 5))
18
- })
19
-
20
- it("gets a non-existing value", async () => {
21
- const key = newKey()
22
- const res = await new GetRangeCommand(key, 10, 24).exec(client)
23
-
24
- expect(res).toEqual("")
25
- })
@@ -1,10 +0,0 @@
1
- import { Command } from "../command"
2
-
3
- /**
4
- * @see https://redis.io/commands/getrange
5
- */
6
- export class GetRangeCommand extends Command<string, string> {
7
- constructor(key: string, start: number, end: number) {
8
- super(["getrange", key, start, end])
9
- }
10
- }
@@ -1,33 +0,0 @@
1
- import { keygen, newHttpClient } from "../test-utils"
2
- import { randomUUID } from "crypto"
3
- import { it, expect, afterAll } from "@jest/globals"
4
- import { GetSetCommand } from "./getset"
5
- import { SetCommand } from "./set"
6
- import { GetCommand } from "./get"
7
- const client = newHttpClient()
8
-
9
- const { newKey, cleanup } = keygen()
10
- afterAll(cleanup)
11
-
12
- it("overwrites the original value", async () => {
13
- const key = newKey()
14
- const value = randomUUID()
15
- const newValue = randomUUID()
16
- await new SetCommand(key, value).exec(client)
17
- const res = await new GetSetCommand(key, newValue).exec(client)
18
-
19
- expect(res).toEqual(value)
20
- const res2 = await new GetCommand(key).exec(client)
21
-
22
- expect(res2).toEqual(newValue)
23
- })
24
- it("sets a new value if empty", async () => {
25
- const key = newKey()
26
- const newValue = randomUUID()
27
- const res = await new GetSetCommand(key, newValue).exec(client)
28
-
29
- expect(res).toBeNull()
30
- const res2 = await new GetCommand(key).exec(client)
31
-
32
- expect(res2).toEqual(newValue)
33
- })
@@ -1,10 +0,0 @@
1
- import { Command } from "../command"
2
-
3
- /**
4
- * @see https://redis.io/commands/getset
5
- */
6
- export class GetSetCommand<TData = string> extends Command<TData | null, unknown | null> {
7
- constructor(key: string, value: TData) {
8
- super(["getset", key, value])
9
- }
10
- }
@@ -1,30 +0,0 @@
1
- import { keygen, newHttpClient } from "../test-utils"
2
- import { randomUUID } from "crypto"
3
- import { it, expect, afterAll } from "@jest/globals"
4
- import { HDelCommand } from "./hdel"
5
- import { HSetCommand } from "./hset"
6
- import { HGetCommand } from "./hget"
7
- const client = newHttpClient()
8
-
9
- const { newKey, cleanup } = keygen()
10
- afterAll(cleanup)
11
-
12
- it("deletes a hash that does not exist", async () => {
13
- const key = newKey()
14
- const field = randomUUID()
15
- const res = await new HDelCommand(key, field).exec(client)
16
-
17
- expect(res).toEqual(0)
18
- })
19
-
20
- it("deletes a field that exists", async () => {
21
- const key = newKey()
22
- const field = randomUUID()
23
- await new HSetCommand(key, field, randomUUID()).exec(client)
24
- const res = await new HDelCommand(key, field).exec(client)
25
-
26
- expect(res).toEqual(1)
27
- const res2 = await new HGetCommand(key, field).exec(client)
28
-
29
- expect(res2).toEqual(null)
30
- })
@@ -1,10 +0,0 @@
1
- import { Command } from "../command"
2
-
3
- /**
4
- * @see https://redis.io/commands/hdel
5
- */
6
- export class HDelCommand extends Command<0 | 1, "0" | "1"> {
7
- constructor(key: string, field: string) {
8
- super(["hdel", key, field])
9
- }
10
- }
@@ -1,31 +0,0 @@
1
- import { keygen, newHttpClient } from "../test-utils"
2
- import { randomUUID } from "crypto"
3
- import { it, expect, afterAll } from "@jest/globals"
4
- import { HSetCommand } from "./hset"
5
- import { HExistsCommand } from "./hexists"
6
-
7
- const client = newHttpClient()
8
-
9
- const { newKey, cleanup } = keygen()
10
- afterAll(cleanup)
11
-
12
- it("returns 1 for an existing field", async () => {
13
- const key = newKey()
14
- const field = randomUUID()
15
- await new HSetCommand(key, field, randomUUID()).exec(client)
16
- const res = await new HExistsCommand(key, field).exec(client)
17
- expect(res).toEqual(1)
18
- })
19
- it("returns 0 if field does not exist", async () => {
20
- const key = newKey()
21
- await new HSetCommand(key, randomUUID(), randomUUID()).exec(client)
22
-
23
- const res = await new HExistsCommand(key, "not-existing-field").exec(client)
24
- expect(res).toEqual(0)
25
- })
26
- it("returns 0 if hash does not exist", async () => {
27
- const key = newKey()
28
- const field = randomUUID()
29
- const res = await new HExistsCommand(key, field).exec(client)
30
- expect(res).toEqual(0)
31
- })
@@ -1,10 +0,0 @@
1
- import { Command } from "../command"
2
-
3
- /**
4
- * @see https://redis.io/commands/hexists
5
- */
6
- export class HExistsCommand extends Command<number, number> {
7
- constructor(key: string, field: string) {
8
- super(["hexists", key, field])
9
- }
10
- }
@@ -1,47 +0,0 @@
1
- import { keygen, newHttpClient } from "../test-utils"
2
- import { randomUUID } from "crypto"
3
- import { it, expect, afterAll } from "@jest/globals"
4
- import { HSetCommand } from "./hset"
5
- import { HGetCommand } from "./hget"
6
-
7
- const client = newHttpClient()
8
-
9
- const { newKey, cleanup } = keygen()
10
- afterAll(cleanup)
11
-
12
- it("gets an exiting value", async () => {
13
- const key = newKey()
14
- const field = randomUUID()
15
- const value = randomUUID()
16
- await new HSetCommand(key, field, value).exec(client)
17
- const res = await new HGetCommand(key, field).exec(client)
18
-
19
- expect(res).toEqual(value)
20
- })
21
-
22
- it("gets a non-existing hash", async () => {
23
- const key = newKey()
24
- const field = randomUUID()
25
- const res = await new HGetCommand(key, field).exec(client)
26
-
27
- expect(res).toBeNull()
28
- })
29
-
30
- it("gets a non-existing field", async () => {
31
- const key = newKey()
32
- const field = randomUUID()
33
- await new HSetCommand(key, randomUUID(), randomUUID()).exec(client)
34
- const res = await new HGetCommand(key, field).exec(client)
35
-
36
- expect(res).toBeNull()
37
- })
38
-
39
- it("gets an object", async () => {
40
- const key = newKey()
41
- const field = randomUUID()
42
- const value = { v: randomUUID() }
43
- await new HSetCommand(key, field, value).exec(client)
44
- const res = await new HGetCommand(key, field).exec(client)
45
-
46
- expect(res).toEqual(value)
47
- })
@@ -1,10 +0,0 @@
1
- import { Command } from "../command"
2
-
3
- /**
4
- * @see https://redis.io/commands/hget
5
- */
6
- export class HGetCommand<TData> extends Command<TData | null, unknown | null> {
7
- constructor(key: string, field: string) {
8
- super(["hget", key, field])
9
- }
10
- }
@@ -1,32 +0,0 @@
1
- import { keygen, newHttpClient } from "../test-utils"
2
- import { randomUUID } from "crypto"
3
- import { describe, it, expect, afterAll } from "@jest/globals"
4
- import { HSetCommand } from "./hset"
5
- import { HGetAllCommand } from "./hgetall"
6
-
7
- const client = newHttpClient()
8
-
9
- const { newKey, cleanup } = keygen()
10
- afterAll(cleanup)
11
- it("returns all fields", async () => {
12
- const key = newKey()
13
- const field2 = randomUUID()
14
- const field1 = randomUUID()
15
- const value1 = false
16
- const value2 = randomUUID()
17
- await new HSetCommand(key, field1, value1).exec(client)
18
- await new HSetCommand(key, field2, value2).exec(client)
19
- const res = await new HGetAllCommand(key).exec(client)
20
-
21
- const obj = {
22
- [field1]: value1,
23
- [field2]: value2,
24
- }
25
- expect(res).toEqual(obj)
26
- })
27
- describe("when hash does not exist", () => {
28
- it("it returns null", async () => {
29
- const res = await new HGetAllCommand(randomUUID()).exec(client)
30
- expect(res).toBeNull()
31
- })
32
- })
@@ -1,35 +0,0 @@
1
- import { Command } from "../command"
2
-
3
- /**
4
- *
5
- * @param result De
6
- * @returns
7
- */
8
- function deserialize<TData extends Record<string, unknown>>(result: string[]): TData | null {
9
- if (result.length === 0) {
10
- return null
11
- }
12
- const obj: Record<string, unknown> = {}
13
- while (result.length >= 2) {
14
- const key = result.shift()!
15
- const value = result.shift()!
16
- try {
17
- obj[key] = JSON.parse(value)
18
- } catch {
19
- obj[key] = value
20
- }
21
- }
22
- return obj as TData
23
- }
24
-
25
- /**
26
- * @see https://redis.io/commands/hgetall
27
- */
28
- export class HGetAllCommand<TData extends Record<string, unknown>> extends Command<
29
- TData | null,
30
- unknown | null
31
- > {
32
- constructor(key: string) {
33
- super(["hgetall", key], { deserialize: (result) => deserialize<TData>(result as string[]) })
34
- }
35
- }
@@ -1,27 +0,0 @@
1
- import { keygen, newHttpClient } from "../test-utils"
2
- import { randomUUID } from "crypto"
3
- import { it, expect, afterAll } from "@jest/globals"
4
-
5
- import { HSetCommand } from "./hset"
6
- import { HIncrByCommand } from "./hincrby"
7
- const client = newHttpClient()
8
-
9
- const { newKey, cleanup } = keygen()
10
- afterAll(cleanup)
11
-
12
- it("increments a non-existing value", async () => {
13
- const key = newKey()
14
- const field = randomUUID()
15
- const res = await new HIncrByCommand(key, field, 2).exec(client)
16
-
17
- expect(res).toEqual(2)
18
- })
19
-
20
- it("increments and existing value", async () => {
21
- const key = newKey()
22
- const field = randomUUID()
23
- await new HSetCommand(key, field, 5).exec(client)
24
- const res = await new HIncrByCommand(key, field, 2).exec(client)
25
-
26
- expect(res).toEqual(7)
27
- })
@@ -1,10 +0,0 @@
1
- import { Command } from "../command"
2
-
3
- /**
4
- * @see https://redis.io/commands/hincrby
5
- */
6
- export class HIncrByCommand extends Command<number, number> {
7
- constructor(key: string, field: string, increment: number) {
8
- super(["hincrby", key, field, increment])
9
- }
10
- }
@@ -1,25 +0,0 @@
1
- import { keygen, newHttpClient } from "../test-utils"
2
- import { randomUUID } from "crypto"
3
- import { it, expect, afterAll } from "@jest/globals"
4
- import { HIncrByFloatCommand } from "./hincrbyfloat"
5
- import { HSetCommand } from "./hset"
6
- const client = newHttpClient()
7
-
8
- const { newKey, cleanup } = keygen()
9
- afterAll(cleanup)
10
- it("increments a non-existing value", async () => {
11
- const key = newKey()
12
- const field = randomUUID()
13
- const res = await new HIncrByFloatCommand(key, field, 2.5).exec(client)
14
-
15
- expect(res).toEqual(2.5)
16
- })
17
-
18
- it("increments and existing value", async () => {
19
- const key = newKey()
20
- const field = randomUUID()
21
- await new HSetCommand(key, field, 5).exec(client)
22
- const res = await new HIncrByFloatCommand(key, field, 2.5).exec(client)
23
-
24
- expect(res).toEqual(7.5)
25
- })
@@ -1,10 +0,0 @@
1
- import { Command } from "../command"
2
-
3
- /**
4
- * @see https://redis.io/commands/hincrbyfloat
5
- */
6
- export class HIncrByFloatCommand extends Command<number, number> {
7
- constructor(key: string, field: string, increment: number) {
8
- super(["hincrbyfloat", key, field, increment])
9
- }
10
- }
@@ -1,22 +0,0 @@
1
- import { keygen, newHttpClient } from "../test-utils"
2
- import { randomUUID } from "crypto"
3
- import { describe, it, expect, afterAll } from "@jest/globals"
4
- import { HMSetCommand } from "./hmset"
5
- import { HKeysCommand } from "./hkeys"
6
- const client = newHttpClient()
7
-
8
- const { newKey, cleanup } = keygen()
9
- afterAll(cleanup)
10
-
11
- describe("with existing hash", () => {
12
- it("returns all keys", async () => {
13
- const key = newKey()
14
- const kv = {
15
- [randomUUID()]: randomUUID(),
16
- [randomUUID()]: randomUUID(),
17
- }
18
- await new HMSetCommand(key, kv).exec(client)
19
- const res = await new HKeysCommand(key).exec(client)
20
- expect(res.sort()).toEqual(Object.keys(kv).sort())
21
- })
22
- })
@@ -1,10 +0,0 @@
1
- import { Command } from "../command"
2
-
3
- /**
4
- * @see https://redis.io/commands/hkeys
5
- */
6
- export class HKeysCommand extends Command<string[], string[]> {
7
- constructor(key: string) {
8
- super(["hkeys", key])
9
- }
10
- }
@@ -1,24 +0,0 @@
1
- import { keygen, newHttpClient } from "../test-utils"
2
- import { randomUUID } from "crypto"
3
- import { describe, it, expect, afterAll } from "@jest/globals"
4
- import { HMSetCommand } from "./hmset"
5
- import { HLenCommand } from "./hlen"
6
- const client = newHttpClient()
7
-
8
- const { newKey, cleanup } = keygen()
9
- afterAll(cleanup)
10
-
11
- describe("with existing hash", () => {
12
- it("returns correct number of keys", async () => {
13
- const key = newKey()
14
- const field1 = randomUUID()
15
- const field2 = randomUUID()
16
-
17
- const kv: Record<string, string> = {}
18
- kv[field1] = randomUUID()
19
- kv[field2] = randomUUID()
20
- await new HMSetCommand(key, kv).exec(client)
21
- const res = await new HLenCommand(key).exec(client)
22
- expect(res).toEqual(2)
23
- })
24
- })
@@ -1,10 +0,0 @@
1
- import { Command } from "../command"
2
-
3
- /**
4
- * @see https://redis.io/commands/hlen
5
- */
6
- export class HLenCommand extends Command<number, number> {
7
- constructor(key: string) {
8
- super(["hlen", key])
9
- }
10
- }
@@ -1,48 +0,0 @@
1
- import { keygen, newHttpClient } from "../test-utils"
2
- import { randomUUID } from "crypto"
3
- import { it, expect, describe, afterAll } from "@jest/globals"
4
-
5
- import { HMSetCommand } from "./hmset"
6
- import { HMGetCommand } from "./hmget"
7
- import { HSetCommand } from "./hset"
8
- const client = newHttpClient()
9
-
10
- const { newKey, cleanup } = keygen()
11
- afterAll(cleanup)
12
-
13
- it("gets exiting values", async () => {
14
- const key = newKey()
15
- const field1 = randomUUID()
16
- const value1 = randomUUID()
17
- const field2 = randomUUID()
18
- const value2 = randomUUID()
19
- const kv: Record<string, string> = {
20
- [field1]: value1,
21
- [field2]: value2,
22
- }
23
- const res = await new HMSetCommand(key, kv).exec(client)
24
-
25
- expect(res).toEqual("OK")
26
- const res2 = await new HMGetCommand(key, field1, field2).exec(client)
27
-
28
- expect(res2).toEqual(kv)
29
- })
30
-
31
- describe("when the hash does not exist", () => {
32
- it("returns null", async () => {
33
- const key = newKey()
34
- const res = await new HMGetCommand(key, randomUUID()).exec(client)
35
-
36
- expect(res).toBeNull()
37
- })
38
- })
39
-
40
- it("gets an object", async () => {
41
- const key = newKey()
42
- const field = randomUUID()
43
- const value = { v: randomUUID() }
44
- await new HSetCommand(key, field, value).exec(client)
45
- const cmd = new HMGetCommand(key, field)
46
- const res = await cmd.exec(client)
47
- expect(res).toEqual({ [field]: value })
48
- })
@@ -1,41 +0,0 @@
1
- import { Command } from "../command"
2
-
3
- function deserialize<TData extends Record<string, unknown>>(
4
- fields: string[],
5
- result: (string | null)[],
6
- ): TData | null {
7
- if (result.length === 0 || result.every((field) => field === null)) {
8
- return null
9
- }
10
- const obj: Record<string, unknown> = {}
11
- for (let i = 0; i < fields.length; i++) {
12
- try {
13
- obj[fields[i]] = JSON.parse(result[i]!)
14
- } catch {
15
- obj[fields[i]] = result[i]
16
- }
17
- }
18
- return obj as TData
19
- }
20
-
21
- /**
22
- * hmget returns an object of all requested fields from a hash
23
- * The field values are returned as an object like this:
24
- * ```ts
25
- * {[fieldName: string]: T | null}
26
- * ```
27
- *
28
- * In case the hash does not exist or all fields are empty `null` is returned
29
- *
30
- * @see https://redis.io/commands/hmget
31
- */
32
- export class HMGetCommand<TData extends Record<string, unknown>> extends Command<
33
- TData | null,
34
- (string | null)[]
35
- > {
36
- constructor(key: string, ...fields: string[]) {
37
- super(["hmget", key, ...fields], {
38
- deserialize: (result) => deserialize<TData>(fields, result),
39
- })
40
- }
41
- }
@@ -1,24 +0,0 @@
1
- import { keygen, newHttpClient } from "../test-utils"
2
- import { randomUUID } from "crypto"
3
- import { it, expect, afterAll } from "@jest/globals"
4
- import { HMSetCommand } from "./hmset"
5
- import { HMGetCommand } from "./hmget"
6
-
7
- const client = newHttpClient()
8
-
9
- const { newKey, cleanup } = keygen()
10
- afterAll(cleanup)
11
-
12
- it("gets exiting values", async () => {
13
- const key = newKey()
14
- const kv = {
15
- [randomUUID()]: randomUUID(),
16
- [randomUUID()]: randomUUID(),
17
- }
18
- const res = await new HMSetCommand(key, kv).exec(client)
19
-
20
- expect(res).toEqual("OK")
21
- const res2 = await new HMGetCommand(key, ...Object.keys(kv)).exec(client)
22
-
23
- expect(res2).toEqual(kv)
24
- })
@@ -1,10 +0,0 @@
1
- import { Command } from "../command"
2
-
3
- /**
4
- * @see https://redis.io/commands/hmset
5
- */
6
- export class HMSetCommand<TData> extends Command<number, number> {
7
- constructor(key: string, kv: { [field: string]: TData }) {
8
- super(["hmset", key, ...Object.entries(kv).flatMap(([field, value]) => [field, value])])
9
- }
10
- }
@@ -1,46 +0,0 @@
1
- import { keygen, newHttpClient } from "../test-utils"
2
- import { it, describe, expect, afterAll } from "@jest/globals"
3
- import { HSetCommand } from "./hset"
4
- import { HScanCommand } from "./hscan"
5
- const client = newHttpClient()
6
-
7
- const { newKey, cleanup } = keygen()
8
- afterAll(cleanup)
9
- describe("without options", () => {
10
- it("returns cursor and members", async () => {
11
- const key = newKey()
12
- await new HSetCommand(key, "field", "value").exec(client)
13
- const res = await new HScanCommand(key, 0).exec(client)
14
-
15
- expect(res).toBeDefined()
16
- expect(res.length).toBe(2)
17
- expect(typeof res[0]).toBe("number")
18
- expect(res![1].length).toBeGreaterThan(0)
19
- })
20
- })
21
-
22
- describe("with match", () => {
23
- it("returns cursor and members", async () => {
24
- const key = newKey()
25
- await new HSetCommand(key, "field", "value").exec(client)
26
- const res = await new HScanCommand(key, 0, { match: "field" }).exec(client)
27
-
28
- expect(res).toBeDefined()
29
- expect(res.length).toBe(2)
30
- expect(typeof res[0]).toBe("number")
31
- expect(res![1].length).toBeGreaterThan(0)
32
- })
33
- })
34
-
35
- describe("with count", () => {
36
- it("returns cursor and members", async () => {
37
- const key = newKey()
38
- await new HSetCommand(key, "field", "value").exec(client)
39
- const res = await new HScanCommand(key, 0, { count: 1 }).exec(client)
40
-
41
- expect(res).toBeDefined()
42
- expect(res.length).toBe(2)
43
- expect(typeof res[0]).toBe("number")
44
- expect(res![1].length).toBeGreaterThan(0)
45
- })
46
- })
@@ -1,22 +0,0 @@
1
- import { ScanCommandOptions } from "./scan"
2
- import { Command } from "../command"
3
-
4
- /**
5
- * @see https://redis.io/commands/hscan
6
- */
7
- export class HScanCommand extends Command<
8
- [number, (string | number)[]],
9
- [number, (string | number)[]]
10
- > {
11
- constructor(key: string, cursor: number, opts?: ScanCommandOptions) {
12
- const command = ["hscan", key, cursor]
13
- if (opts?.match) {
14
- command.push("match", opts.match)
15
- }
16
- if (typeof opts?.count === "number") {
17
- command.push("count", opts.count)
18
- }
19
-
20
- super(command)
21
- }
22
- }
@@ -1,21 +0,0 @@
1
- import { keygen, newHttpClient } from "../test-utils"
2
- import { randomUUID } from "crypto"
3
- import { it, expect, afterAll } from "@jest/globals"
4
- import { HSetCommand } from "./hset"
5
- import { HGetCommand } from "./hget"
6
- const client = newHttpClient()
7
-
8
- const { newKey, cleanup } = keygen()
9
- afterAll(cleanup)
10
- it("sets value", async () => {
11
- const key = newKey()
12
- const field = randomUUID()
13
- const value = randomUUID()
14
-
15
- const res = await new HSetCommand(key, field, value).exec(client)
16
-
17
- expect(res).toEqual(1)
18
- const res2 = await new HGetCommand(key, field).exec(client)
19
-
20
- expect(res2).toEqual(value)
21
- })