@upstash/redis 0.0.0-ci.e730ad54-20220901 → 0.0.0-ci.eb0d57e1-20231019

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 (143) hide show
  1. package/README.md +20 -18
  2. package/esm/pkg/commands/command.js +12 -3
  3. package/esm/pkg/commands/geo_add.js +27 -0
  4. package/esm/pkg/commands/getdel.js +9 -0
  5. package/esm/pkg/commands/hgetall.js +9 -5
  6. package/esm/pkg/commands/hrandfield.js +39 -0
  7. package/esm/pkg/commands/json_arrappend.js +9 -0
  8. package/esm/pkg/commands/json_arrindex.js +9 -0
  9. package/esm/pkg/commands/json_arrinsert.js +9 -0
  10. package/esm/pkg/commands/json_arrlen.js +9 -0
  11. package/esm/pkg/commands/json_arrpop.js +9 -0
  12. package/esm/pkg/commands/json_arrtrim.js +12 -0
  13. package/esm/pkg/commands/json_clear.js +9 -0
  14. package/esm/pkg/commands/json_del.js +9 -0
  15. package/esm/pkg/commands/json_forget.js +9 -0
  16. package/esm/pkg/commands/json_get.js +30 -0
  17. package/esm/pkg/commands/json_mget.js +9 -0
  18. package/esm/pkg/commands/json_numincrby.js +9 -0
  19. package/esm/pkg/commands/json_nummultby.js +9 -0
  20. package/esm/pkg/commands/json_objkeys.js +9 -0
  21. package/esm/pkg/commands/json_objlen.js +9 -0
  22. package/esm/pkg/commands/json_resp.js +9 -0
  23. package/esm/pkg/commands/json_set.js +18 -0
  24. package/esm/pkg/commands/json_strappend.js +9 -0
  25. package/esm/pkg/commands/json_strlen.js +9 -0
  26. package/esm/pkg/commands/json_toggle.js +9 -0
  27. package/esm/pkg/commands/json_type.js +9 -0
  28. package/esm/pkg/commands/lmove.js +9 -0
  29. package/esm/pkg/commands/mget.js +4 -1
  30. package/esm/pkg/commands/mod.js +29 -0
  31. package/esm/pkg/commands/set.js +1 -1
  32. package/esm/pkg/commands/smismember.js +9 -0
  33. package/esm/pkg/commands/xadd.js +26 -0
  34. package/esm/pkg/commands/xrange.js +36 -0
  35. package/esm/pkg/commands/zdiffstore.js +9 -0
  36. package/esm/pkg/commands/zmscore.js +1 -2
  37. package/esm/pkg/commands/zunion.js +30 -0
  38. package/esm/pkg/http.js +100 -3
  39. package/esm/pkg/pipeline.js +175 -12
  40. package/esm/pkg/redis.js +219 -2
  41. package/esm/platforms/cloudflare.js +10 -2
  42. package/esm/platforms/fastly.js +6 -0
  43. package/esm/platforms/node_with_fetch.js +26 -1
  44. package/esm/platforms/nodejs.js +24 -1
  45. package/esm/version.js +1 -0
  46. package/package.json +53 -20
  47. package/script/pkg/commands/command.js +12 -3
  48. package/script/pkg/commands/geo_add.js +31 -0
  49. package/script/pkg/commands/getdel.js +13 -0
  50. package/script/pkg/commands/hgetall.js +9 -5
  51. package/script/pkg/commands/hrandfield.js +43 -0
  52. package/script/pkg/commands/json_arrappend.js +13 -0
  53. package/script/pkg/commands/json_arrindex.js +13 -0
  54. package/script/pkg/commands/json_arrinsert.js +13 -0
  55. package/script/pkg/commands/json_arrlen.js +13 -0
  56. package/script/pkg/commands/json_arrpop.js +13 -0
  57. package/script/pkg/commands/json_arrtrim.js +16 -0
  58. package/script/pkg/commands/json_clear.js +13 -0
  59. package/script/pkg/commands/json_del.js +13 -0
  60. package/script/pkg/commands/json_forget.js +13 -0
  61. package/script/pkg/commands/json_get.js +34 -0
  62. package/script/pkg/commands/json_mget.js +13 -0
  63. package/script/pkg/commands/json_numincrby.js +13 -0
  64. package/script/pkg/commands/json_nummultby.js +13 -0
  65. package/script/pkg/commands/json_objkeys.js +13 -0
  66. package/script/pkg/commands/json_objlen.js +13 -0
  67. package/script/pkg/commands/json_resp.js +13 -0
  68. package/script/pkg/commands/json_set.js +22 -0
  69. package/script/pkg/commands/json_strappend.js +13 -0
  70. package/script/pkg/commands/json_strlen.js +13 -0
  71. package/script/pkg/commands/json_toggle.js +13 -0
  72. package/script/pkg/commands/json_type.js +13 -0
  73. package/script/pkg/commands/lmove.js +13 -0
  74. package/script/pkg/commands/mget.js +4 -1
  75. package/script/pkg/commands/mod.js +29 -0
  76. package/script/pkg/commands/set.js +1 -1
  77. package/script/pkg/commands/smismember.js +13 -0
  78. package/script/pkg/commands/xadd.js +30 -0
  79. package/script/pkg/commands/xrange.js +40 -0
  80. package/script/pkg/commands/zdiffstore.js +13 -0
  81. package/script/pkg/commands/zmscore.js +1 -2
  82. package/script/pkg/commands/zunion.js +34 -0
  83. package/script/pkg/http.js +100 -3
  84. package/script/pkg/pipeline.js +174 -11
  85. package/script/pkg/redis.js +218 -1
  86. package/script/platforms/cloudflare.js +10 -2
  87. package/script/platforms/fastly.js +6 -0
  88. package/script/platforms/node_with_fetch.js +26 -1
  89. package/script/platforms/nodejs.js +24 -1
  90. package/script/version.js +4 -0
  91. package/types/pkg/commands/command.d.ts +5 -5
  92. package/types/pkg/commands/geo_add.d.ts +25 -0
  93. package/types/pkg/commands/getdel.d.ts +7 -0
  94. package/types/pkg/commands/hdel.d.ts +1 -1
  95. package/types/pkg/commands/hrandfield.d.ts +9 -0
  96. package/types/pkg/commands/json_arrappend.d.ts +7 -0
  97. package/types/pkg/commands/json_arrindex.d.ts +13 -0
  98. package/types/pkg/commands/json_arrinsert.d.ts +7 -0
  99. package/types/pkg/commands/json_arrlen.d.ts +7 -0
  100. package/types/pkg/commands/json_arrpop.d.ts +7 -0
  101. package/types/pkg/commands/json_arrtrim.d.ts +7 -0
  102. package/types/pkg/commands/json_clear.d.ts +7 -0
  103. package/types/pkg/commands/json_del.d.ts +7 -0
  104. package/types/pkg/commands/json_forget.d.ts +7 -0
  105. package/types/pkg/commands/json_get.d.ts +15 -0
  106. package/types/pkg/commands/json_mget.d.ts +7 -0
  107. package/types/pkg/commands/json_numincrby.d.ts +7 -0
  108. package/types/pkg/commands/json_nummultby.d.ts +7 -0
  109. package/types/pkg/commands/json_objkeys.d.ts +7 -0
  110. package/types/pkg/commands/json_objlen.d.ts +7 -0
  111. package/types/pkg/commands/json_resp.d.ts +7 -0
  112. package/types/pkg/commands/json_set.d.ts +18 -0
  113. package/types/pkg/commands/json_strappend.d.ts +7 -0
  114. package/types/pkg/commands/json_strlen.d.ts +7 -0
  115. package/types/pkg/commands/json_toggle.d.ts +7 -0
  116. package/types/pkg/commands/json_type.d.ts +7 -0
  117. package/types/pkg/commands/lmove.d.ts +12 -0
  118. package/types/pkg/commands/mget.d.ts +1 -1
  119. package/types/pkg/commands/mod.d.ts +29 -0
  120. package/types/pkg/commands/scan.d.ts +1 -1
  121. package/types/pkg/commands/script_flush.d.ts +1 -1
  122. package/types/pkg/commands/set.d.ts +3 -3
  123. package/types/pkg/commands/smembers.d.ts +2 -2
  124. package/types/pkg/commands/smismember.d.ts +7 -0
  125. package/types/pkg/commands/type.d.ts +1 -1
  126. package/types/pkg/commands/xadd.d.ts +31 -0
  127. package/types/pkg/commands/xrange.d.ts +9 -0
  128. package/types/pkg/commands/zadd.d.ts +3 -3
  129. package/types/pkg/commands/zdiffstore.d.ts +7 -0
  130. package/types/pkg/commands/zinterstore.d.ts +1 -1
  131. package/types/pkg/commands/zmscore.d.ts +1 -1
  132. package/types/pkg/commands/zrange.d.ts +1 -1
  133. package/types/pkg/commands/zunion.d.ts +29 -0
  134. package/types/pkg/commands/zunionstore.d.ts +1 -1
  135. package/types/pkg/http.d.ts +48 -7
  136. package/types/pkg/pipeline.d.ts +260 -126
  137. package/types/pkg/redis.d.ts +170 -12
  138. package/types/pkg/types.d.ts +27 -1
  139. package/types/platforms/cloudflare.d.ts +9 -8
  140. package/types/platforms/fastly.d.ts +3 -7
  141. package/types/platforms/node_with_fetch.d.ts +3 -22
  142. package/types/platforms/nodejs.d.ts +4 -7
  143. package/types/version.d.ts +1 -0
@@ -0,0 +1,30 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/zunion
4
+ */
5
+ export class ZUnionCommand extends Command {
6
+ constructor([numKeys, keyOrKeys, opts], cmdOpts) {
7
+ const command = ["zunion", numKeys];
8
+ if (Array.isArray(keyOrKeys)) {
9
+ command.push(...keyOrKeys);
10
+ }
11
+ else {
12
+ command.push(keyOrKeys);
13
+ }
14
+ if (opts) {
15
+ if ("weights" in opts && opts.weights) {
16
+ command.push("weights", ...opts.weights);
17
+ }
18
+ else if ("weight" in opts && typeof opts.weight === "number") {
19
+ command.push("weights", opts.weight);
20
+ }
21
+ if ("aggregate" in opts) {
22
+ command.push("aggregate", opts.aggregate);
23
+ }
24
+ if (opts?.withScores) {
25
+ command.push("withscores");
26
+ }
27
+ }
28
+ super(command, cmdOpts);
29
+ }
30
+ }
package/esm/pkg/http.js CHANGED
@@ -25,9 +25,20 @@ export class HttpClient {
25
25
  writable: true,
26
26
  value: void 0
27
27
  });
28
+ this.options = {
29
+ backend: config.options?.backend,
30
+ agent: config.agent,
31
+ responseEncoding: config.responseEncoding ?? "base64",
32
+ cache: config.cache,
33
+ };
28
34
  this.baseUrl = config.baseUrl.replace(/\/$/, "");
29
- this.headers = { "Content-Type": "application/json", ...config.headers };
30
- this.options = { backend: config.options?.backend };
35
+ this.headers = {
36
+ "Content-Type": "application/json",
37
+ ...config.headers,
38
+ };
39
+ if (this.options.responseEncoding === "base64") {
40
+ this.headers["Upstash-Encoding"] = "base64";
41
+ }
31
42
  if (typeof config?.retry === "boolean" && config?.retry === false) {
32
43
  this.retry = {
33
44
  attempts: 1,
@@ -42,12 +53,31 @@ export class HttpClient {
42
53
  };
43
54
  }
44
55
  }
56
+ mergeTelemetry(telemetry) {
57
+ function merge(obj, key, value) {
58
+ if (!value) {
59
+ return obj;
60
+ }
61
+ if (obj[key]) {
62
+ obj[key] = [obj[key], value].join(",");
63
+ }
64
+ else {
65
+ obj[key] = value;
66
+ }
67
+ return obj;
68
+ }
69
+ this.headers = merge(this.headers, "Upstash-Telemetry-Runtime", telemetry.runtime);
70
+ this.headers = merge(this.headers, "Upstash-Telemetry-Platform", telemetry.platform);
71
+ this.headers = merge(this.headers, "Upstash-Telemetry-Sdk", telemetry.sdk);
72
+ }
45
73
  async request(req) {
46
74
  const requestOptions = {
75
+ cache: this.options.cache,
47
76
  method: "POST",
48
77
  headers: this.headers,
49
78
  body: JSON.stringify(req.body),
50
79
  keepalive: true,
80
+ agent: this.options?.agent,
51
81
  /**
52
82
  * Fastly specific
53
83
  */
@@ -70,8 +100,75 @@ export class HttpClient {
70
100
  }
71
101
  const body = (await res.json());
72
102
  if (!res.ok) {
73
- throw new UpstashError(body.error);
103
+ throw new UpstashError(`${body.error}, command was: ${JSON.stringify(req.body)}`);
104
+ }
105
+ if (this.options?.responseEncoding === "base64") {
106
+ if (Array.isArray(body)) {
107
+ return body.map(({ result, error }) => ({
108
+ result: decode(result),
109
+ error,
110
+ }));
111
+ }
112
+ const result = decode(body.result);
113
+ return { result, error: body.error };
74
114
  }
75
115
  return body;
76
116
  }
77
117
  }
118
+ function base64decode(b64) {
119
+ let dec = "";
120
+ try {
121
+ /**
122
+ * Using only atob() is not enough because it doesn't work with unicode characters
123
+ */
124
+ const binString = atob(b64);
125
+ const size = binString.length;
126
+ const bytes = new Uint8Array(size);
127
+ for (let i = 0; i < size; i++) {
128
+ bytes[i] = binString.charCodeAt(i);
129
+ }
130
+ dec = new TextDecoder().decode(bytes);
131
+ }
132
+ catch {
133
+ dec = b64;
134
+ }
135
+ return dec;
136
+ // try {
137
+ // return decodeURIComponent(dec);
138
+ // } catch {
139
+ // return dec;
140
+ // }
141
+ }
142
+ function decode(raw) {
143
+ let result = undefined;
144
+ switch (typeof raw) {
145
+ case "undefined":
146
+ return raw;
147
+ case "number": {
148
+ result = raw;
149
+ break;
150
+ }
151
+ case "object": {
152
+ if (Array.isArray(raw)) {
153
+ result = raw.map((v) => typeof v === "string"
154
+ ? base64decode(v)
155
+ : Array.isArray(v)
156
+ ? v.map(decode)
157
+ : v);
158
+ }
159
+ else {
160
+ // If it's not an array it must be null
161
+ // Apparently null is an object in javascript
162
+ result = null;
163
+ }
164
+ break;
165
+ }
166
+ case "string": {
167
+ result = raw === "OK" ? "OK" : base64decode(raw);
168
+ break;
169
+ }
170
+ default:
171
+ break;
172
+ }
173
+ return result;
174
+ }
@@ -1,6 +1,8 @@
1
- import { AppendCommand, BitCountCommand, BitOpCommand, BitPosCommand, DBSizeCommand, DecrByCommand, DecrCommand, DelCommand, EchoCommand, EvalCommand, EvalshaCommand, ExistsCommand, ExpireAtCommand, ExpireCommand, FlushAllCommand, FlushDBCommand, GetBitCommand, GetCommand, GetRangeCommand, GetSetCommand, HDelCommand, HExistsCommand, HGetAllCommand, HGetCommand, HIncrByCommand, HIncrByFloatCommand, HKeysCommand, HLenCommand, HMGetCommand, HMSetCommand, HScanCommand, HSetCommand, HSetNXCommand, HStrLenCommand, HValsCommand, IncrByCommand, IncrByFloatCommand, IncrCommand, KeysCommand, LIndexCommand, LInsertCommand, LLenCommand, LPopCommand, LPosCommand, LPushCommand, LPushXCommand, LRangeCommand, LRemCommand, LSetCommand, LTrimCommand, MGetCommand, MSetCommand, MSetNXCommand, PersistCommand, PExpireAtCommand, PExpireCommand, PingCommand, PSetEXCommand, PTtlCommand, PublishCommand, RandomKeyCommand, RenameCommand, RenameNXCommand, RPopCommand, RPushCommand, RPushXCommand, SAddCommand, ScanCommand, SCardCommand, ScriptExistsCommand, ScriptFlushCommand, ScriptLoadCommand, SDiffCommand, SDiffStoreCommand, SetBitCommand, SetCommand, SetExCommand, SetNxCommand, SetRangeCommand, SInterCommand, SInterStoreCommand, SIsMemberCommand, SMembersCommand, SMoveCommand, SPopCommand, SRandMemberCommand, SRemCommand, SScanCommand, StrLenCommand, SUnionCommand, SUnionStoreCommand, TimeCommand, TouchCommand, TtlCommand, TypeCommand, UnlinkCommand, ZAddCommand, ZCardCommand, ZCountCommand, ZIncrByCommand, ZInterStoreCommand, ZLexCountCommand, ZPopMaxCommand, ZPopMinCommand, ZRangeCommand, ZRankCommand, ZRemCommand, ZRemRangeByLexCommand, ZRemRangeByRankCommand, ZRemRangeByScoreCommand, ZRevRankCommand, ZScanCommand, ZScoreCommand, ZUnionStoreCommand, } from "./commands/mod.js";
1
+ import { AppendCommand, BitCountCommand, BitOpCommand, BitPosCommand, DBSizeCommand, DecrByCommand, DecrCommand, DelCommand, EchoCommand, EvalCommand, EvalshaCommand, ExistsCommand, ExpireAtCommand, ExpireCommand, FlushAllCommand, FlushDBCommand, GetBitCommand, GetCommand, GetDelCommand, GetRangeCommand, GetSetCommand, HDelCommand, HExistsCommand, HGetAllCommand, HGetCommand, HIncrByCommand, HIncrByFloatCommand, HKeysCommand, HLenCommand, HMGetCommand, HMSetCommand, HScanCommand, HSetCommand, HSetNXCommand, HStrLenCommand, HValsCommand, IncrByCommand, IncrByFloatCommand, IncrCommand, JsonArrAppendCommand, JsonArrIndexCommand, JsonArrInsertCommand, JsonArrLenCommand, JsonArrPopCommand, JsonArrTrimCommand, JsonClearCommand, JsonDelCommand, JsonForgetCommand, JsonGetCommand, JsonMGetCommand, JsonNumIncrByCommand, JsonNumMultByCommand, JsonObjKeysCommand, JsonObjLenCommand, JsonRespCommand, JsonSetCommand, JsonStrAppendCommand, JsonStrLenCommand, JsonToggleCommand, JsonTypeCommand, KeysCommand, LIndexCommand, LInsertCommand, LLenCommand, LMoveCommand, LPopCommand, LPosCommand, LPushCommand, LPushXCommand, LRangeCommand, LRemCommand, LSetCommand, LTrimCommand, MGetCommand, MSetCommand, MSetNXCommand, PersistCommand, PExpireAtCommand, PExpireCommand, PingCommand, PSetEXCommand, PTtlCommand, PublishCommand, RandomKeyCommand, RenameCommand, RenameNXCommand, RPopCommand, RPushCommand, RPushXCommand, SAddCommand, ScanCommand, SCardCommand, ScriptExistsCommand, ScriptFlushCommand, ScriptLoadCommand, SDiffCommand, SDiffStoreCommand, SetBitCommand, SetCommand, SetExCommand, SetNxCommand, SetRangeCommand, SInterCommand, SInterStoreCommand, SIsMemberCommand, SMembersCommand, SMIsMemberCommand, SMoveCommand, SPopCommand, SRandMemberCommand, SRemCommand, SScanCommand, StrLenCommand, SUnionCommand, SUnionStoreCommand, TimeCommand, TouchCommand, TtlCommand, TypeCommand, UnlinkCommand, ZAddCommand, ZCardCommand, ZCountCommand, ZIncrByCommand, ZInterStoreCommand, ZLexCountCommand, ZPopMaxCommand, ZPopMinCommand, ZRangeCommand, ZRankCommand, ZRemCommand, ZRemRangeByLexCommand, ZRemRangeByRankCommand, ZRemRangeByScoreCommand, ZRevRankCommand, ZScanCommand, ZScoreCommand, ZUnionCommand, ZUnionStoreCommand, } from "./commands/mod.js";
2
2
  import { UpstashError } from "./error.js";
3
3
  import { ZMScoreCommand } from "./commands/zmscore.js";
4
+ import { HRandFieldCommand } from "./commands/hrandfield.js";
5
+ import { ZDiffStoreCommand } from "./commands/zdiffstore.js";
4
6
  /**
5
7
  * Upstash REST API supports command pipelining to send multiple commands in
6
8
  * batch, instead of sending each command one by one and waiting for a response.
@@ -17,7 +19,7 @@ import { ZMScoreCommand } from "./commands/zmscore.js";
17
19
  * **Examples:**
18
20
  *
19
21
  * ```ts
20
- * const p = redis.pipeline()
22
+ * const p = redis.pipeline() // or redis.multi()
21
23
  * p.set("key","value")
22
24
  * p.get("key")
23
25
  * const res = await p.exec()
@@ -29,7 +31,7 @@ import { ZMScoreCommand } from "./commands/zmscore.js";
29
31
  * const res = await p.set("key","value").get("key").exec()
30
32
  * ```
31
33
  *
32
- * It's not possible to infer correct types with a dynamic pipeline, so you can
34
+ * Return types are inferred if all commands are chained, but you can still
33
35
  * override the response type manually:
34
36
  * ```ts
35
37
  * redis.pipeline()
@@ -40,7 +42,7 @@ import { ZMScoreCommand } from "./commands/zmscore.js";
40
42
  * ```
41
43
  */
42
44
  export class Pipeline {
43
- constructor(client, commandOptions) {
45
+ constructor(opts) {
44
46
  Object.defineProperty(this, "client", {
45
47
  enumerable: true,
46
48
  configurable: true,
@@ -59,14 +61,22 @@ export class Pipeline {
59
61
  writable: true,
60
62
  value: void 0
61
63
  });
64
+ Object.defineProperty(this, "multiExec", {
65
+ enumerable: true,
66
+ configurable: true,
67
+ writable: true,
68
+ value: void 0
69
+ });
62
70
  /**
63
71
  * Send the pipeline request to upstash.
64
72
  *
65
73
  * Returns an array with the results of all pipelined commands.
66
74
  *
67
- * You can define a return type manually to make working in typescript easier
75
+ * If all commands are statically chained from start to finish, types are inferred. You can still define a return type manually if necessary though:
68
76
  * ```ts
69
- * redis.pipeline().get("key").exec<[{ greeting: string }]>()
77
+ * const p = redis.pipeline()
78
+ * p.get("key")
79
+ * const result = p.exec<[{ greeting: string }]>()
70
80
  * ```
71
81
  */
72
82
  Object.defineProperty(this, "exec", {
@@ -77,8 +87,9 @@ export class Pipeline {
77
87
  if (this.commands.length === 0) {
78
88
  throw new Error("Pipeline is empty");
79
89
  }
90
+ const path = this.multiExec ? ["multi-exec"] : ["pipeline"];
80
91
  const res = (await this.client.request({
81
- path: ["pipeline"],
92
+ path,
82
93
  body: Object.values(this.commands).map((c) => c.command),
83
94
  }));
84
95
  return res.map(({ error, result }, i) => {
@@ -125,6 +136,15 @@ export class Pipeline {
125
136
  writable: true,
126
137
  value: (...args) => this.chain(new BitPosCommand(args, this.commandOptions))
127
138
  });
139
+ /**
140
+ * @see https://redis.io/commands/zdiffstore
141
+ */
142
+ Object.defineProperty(this, "zdiffstore", {
143
+ enumerable: true,
144
+ configurable: true,
145
+ writable: true,
146
+ value: (...args) => this.chain(new ZDiffStoreCommand(args, this.commandOptions))
147
+ });
128
148
  /**
129
149
  * @see https://redis.io/commands/dbsize
130
150
  */
@@ -251,6 +271,15 @@ export class Pipeline {
251
271
  writable: true,
252
272
  value: (...args) => this.chain(new GetBitCommand(args, this.commandOptions))
253
273
  });
274
+ /**
275
+ * @see https://redis.io/commands/getdel
276
+ */
277
+ Object.defineProperty(this, "getdel", {
278
+ enumerable: true,
279
+ configurable: true,
280
+ writable: true,
281
+ value: (...args) => this.chain(new GetDelCommand(args, this.commandOptions))
282
+ });
254
283
  /**
255
284
  * @see https://redis.io/commands/getrange
256
285
  */
@@ -359,6 +388,15 @@ export class Pipeline {
359
388
  writable: true,
360
389
  value: (key, kv) => this.chain(new HMSetCommand([key, kv], this.commandOptions))
361
390
  });
391
+ /**
392
+ * @see https://redis.io/commands/hrandfield
393
+ */
394
+ Object.defineProperty(this, "hrandfield", {
395
+ enumerable: true,
396
+ configurable: true,
397
+ writable: true,
398
+ value: (key, count, withValues) => this.chain(new HRandFieldCommand([key, count, withValues], this.commandOptions))
399
+ });
362
400
  /**
363
401
  * @see https://redis.io/commands/hscan
364
402
  */
@@ -467,6 +505,15 @@ export class Pipeline {
467
505
  writable: true,
468
506
  value: (...args) => this.chain(new LLenCommand(args, this.commandOptions))
469
507
  });
508
+ /**
509
+ * @see https://redis.io/commands/lmove
510
+ */
511
+ Object.defineProperty(this, "lmove", {
512
+ enumerable: true,
513
+ configurable: true,
514
+ writable: true,
515
+ value: (...args) => this.chain(new LMoveCommand(args, this.commandOptions))
516
+ });
470
517
  /**
471
518
  * @see https://redis.io/commands/lpop
472
519
  */
@@ -836,6 +883,15 @@ export class Pipeline {
836
883
  writable: true,
837
884
  value: (...args) => this.chain(new SMembersCommand(args, this.commandOptions))
838
885
  });
886
+ /**
887
+ * @see https://redis.io/commands/smismember
888
+ */
889
+ Object.defineProperty(this, "smismember", {
890
+ enumerable: true,
891
+ configurable: true,
892
+ writable: true,
893
+ value: (key, members) => this.chain(new SMIsMemberCommand([key, members], this.commandOptions))
894
+ });
839
895
  /**
840
896
  * @see https://redis.io/commands/smove
841
897
  */
@@ -1129,16 +1185,123 @@ export class Pipeline {
1129
1185
  writable: true,
1130
1186
  value: (...args) => this.chain(new ZUnionStoreCommand(args, this.commandOptions))
1131
1187
  });
1132
- this.client = client;
1133
- this.commands = [];
1134
- this.commandOptions = commandOptions;
1188
+ /**
1189
+ * @see https://redis.io/commands/zunion
1190
+ */
1191
+ Object.defineProperty(this, "zunion", {
1192
+ enumerable: true,
1193
+ configurable: true,
1194
+ writable: true,
1195
+ value: (...args) => this.chain(new ZUnionCommand(args, this.commandOptions))
1196
+ });
1197
+ this.client = opts.client;
1198
+ this.commands = []; // the TCommands generic in the class definition is only used for carrying through chained command types and should never be explicitly set when instantiating the class
1199
+ this.commandOptions = opts.commandOptions;
1200
+ this.multiExec = opts.multiExec ?? false;
1135
1201
  }
1136
1202
  /**
1137
- * Pushes a command into the pipelien and returns a chainable instance of the
1203
+ * Returns the length of pipeline before the execution
1204
+ */
1205
+ length() {
1206
+ return this.commands.length;
1207
+ }
1208
+ /**
1209
+ * Pushes a command into the pipeline and returns a chainable instance of the
1138
1210
  * pipeline
1139
1211
  */
1140
1212
  chain(command) {
1141
1213
  this.commands.push(command);
1142
- return this;
1214
+ return this; // TS thinks we're returning Pipeline<[]> here, because we're not creating a new instance of the class, hence the cast
1215
+ }
1216
+ /**
1217
+ * @see https://redis.io/commands/?group=json
1218
+ */
1219
+ get json() {
1220
+ return {
1221
+ /**
1222
+ * @see https://redis.io/commands/json.arrappend
1223
+ */
1224
+ arrappend: (...args) => this.chain(new JsonArrAppendCommand(args, this.commandOptions)),
1225
+ /**
1226
+ * @see https://redis.io/commands/json.arrindex
1227
+ */
1228
+ arrindex: (...args) => this.chain(new JsonArrIndexCommand(args, this.commandOptions)),
1229
+ /**
1230
+ * @see https://redis.io/commands/json.arrinsert
1231
+ */
1232
+ arrinsert: (...args) => this.chain(new JsonArrInsertCommand(args, this.commandOptions)),
1233
+ /**
1234
+ * @see https://redis.io/commands/json.arrlen
1235
+ */
1236
+ arrlen: (...args) => this.chain(new JsonArrLenCommand(args, this.commandOptions)),
1237
+ /**
1238
+ * @see https://redis.io/commands/json.arrpop
1239
+ */
1240
+ arrpop: (...args) => this.chain(new JsonArrPopCommand(args, this.commandOptions)),
1241
+ /**
1242
+ * @see https://redis.io/commands/json.arrtrim
1243
+ */
1244
+ arrtrim: (...args) => this.chain(new JsonArrTrimCommand(args, this.commandOptions)),
1245
+ /**
1246
+ * @see https://redis.io/commands/json.clear
1247
+ */
1248
+ clear: (...args) => this.chain(new JsonClearCommand(args, this.commandOptions)),
1249
+ /**
1250
+ * @see https://redis.io/commands/json.del
1251
+ */
1252
+ del: (...args) => this.chain(new JsonDelCommand(args, this.commandOptions)),
1253
+ /**
1254
+ * @see https://redis.io/commands/json.forget
1255
+ */
1256
+ forget: (...args) => this.chain(new JsonForgetCommand(args, this.commandOptions)),
1257
+ /**
1258
+ * @see https://redis.io/commands/json.get
1259
+ */
1260
+ get: (...args) => this.chain(new JsonGetCommand(args, this.commandOptions)),
1261
+ /**
1262
+ * @see https://redis.io/commands/json.mget
1263
+ */
1264
+ mget: (...args) => this.chain(new JsonMGetCommand(args, this.commandOptions)),
1265
+ /**
1266
+ * @see https://redis.io/commands/json.numincrby
1267
+ */
1268
+ numincrby: (...args) => this.chain(new JsonNumIncrByCommand(args, this.commandOptions)),
1269
+ /**
1270
+ * @see https://redis.io/commands/json.nummultby
1271
+ */
1272
+ nummultby: (...args) => this.chain(new JsonNumMultByCommand(args, this.commandOptions)),
1273
+ /**
1274
+ * @see https://redis.io/commands/json.objkeys
1275
+ */
1276
+ objkeys: (...args) => this.chain(new JsonObjKeysCommand(args, this.commandOptions)),
1277
+ /**
1278
+ * @see https://redis.io/commands/json.objlen
1279
+ */
1280
+ objlen: (...args) => this.chain(new JsonObjLenCommand(args, this.commandOptions)),
1281
+ /**
1282
+ * @see https://redis.io/commands/json.resp
1283
+ */
1284
+ resp: (...args) => this.chain(new JsonRespCommand(args, this.commandOptions)),
1285
+ /**
1286
+ * @see https://redis.io/commands/json.set
1287
+ */
1288
+ set: (...args) => this.chain(new JsonSetCommand(args, this.commandOptions)),
1289
+ /**
1290
+ * @see https://redis.io/commands/json.strappend
1291
+ */
1292
+ strappend: (...args) => this.chain(new JsonStrAppendCommand(args, this.commandOptions)),
1293
+ /**
1294
+ * @see https://redis.io/commands/json.strlen
1295
+ */
1296
+ strlen: (...args) => this.chain(new JsonStrLenCommand(args, this.commandOptions)),
1297
+ /**
1298
+ * @see https://redis.io/commands/json.toggle
1299
+ */
1300
+ toggle: (...args) => this.chain(new JsonToggleCommand(args, this.commandOptions)),
1301
+ /**
1302
+ * @see https://redis.io/commands/json.type
1303
+ */
1304
+ type: (...args) => this.chain(new JsonTypeCommand(args, this.commandOptions)),
1305
+ };
1143
1306
  }
1144
1307
  }