@upstash/redis 0.0.0-ci.e3757170 → 0.0.0-ci.e5c2b594-20231017

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 (168) hide show
  1. package/README.md +42 -278
  2. package/esm/deps/deno.land/x/base64@v0.2.1/base.js +100 -0
  3. package/esm/deps/deno.land/x/base64@v0.2.1/base64url.js +9 -0
  4. package/esm/deps/deno.land/x/sha1@v1.0.3/deps.js +1 -0
  5. package/esm/deps/deno.land/x/sha1@v1.0.3/mod.js +191 -0
  6. package/esm/deps/denopkg.com/chiefbiiko/std-encoding@v1.0.0/mod.js +50 -0
  7. package/esm/pkg/commands/command.js +12 -3
  8. package/esm/pkg/commands/getdel.js +9 -0
  9. package/esm/pkg/commands/hgetall.js +0 -4
  10. package/esm/pkg/commands/hrandfield.js +39 -0
  11. package/esm/pkg/commands/json_arrappend.js +9 -0
  12. package/esm/pkg/commands/json_arrindex.js +9 -0
  13. package/esm/pkg/commands/json_arrinsert.js +9 -0
  14. package/esm/pkg/commands/json_arrlen.js +9 -0
  15. package/esm/pkg/commands/json_arrpop.js +9 -0
  16. package/esm/pkg/commands/json_arrtrim.js +12 -0
  17. package/esm/pkg/commands/json_clear.js +9 -0
  18. package/esm/pkg/commands/json_del.js +9 -0
  19. package/esm/pkg/commands/json_forget.js +9 -0
  20. package/esm/pkg/commands/json_get.js +30 -0
  21. package/esm/pkg/commands/json_mget.js +9 -0
  22. package/esm/pkg/commands/json_numincrby.js +9 -0
  23. package/esm/pkg/commands/json_nummultby.js +9 -0
  24. package/esm/pkg/commands/json_objkeys.js +9 -0
  25. package/esm/pkg/commands/json_objlen.js +9 -0
  26. package/esm/pkg/commands/json_resp.js +9 -0
  27. package/esm/pkg/commands/json_set.js +18 -0
  28. package/esm/pkg/commands/json_strappend.js +9 -0
  29. package/esm/pkg/commands/json_strlen.js +9 -0
  30. package/esm/pkg/commands/json_toggle.js +9 -0
  31. package/esm/pkg/commands/json_type.js +9 -0
  32. package/esm/pkg/commands/lmove.js +9 -0
  33. package/esm/pkg/commands/lpos.js +19 -0
  34. package/esm/pkg/commands/mod.js +28 -0
  35. package/esm/pkg/commands/scan.js +3 -0
  36. package/esm/pkg/commands/sdiffstore.js +1 -1
  37. package/esm/pkg/commands/set.js +16 -4
  38. package/esm/pkg/commands/smismember.js +9 -0
  39. package/esm/pkg/commands/xadd.js +26 -0
  40. package/esm/pkg/commands/xrange.js +36 -0
  41. package/esm/pkg/commands/zdiffstore.js +9 -0
  42. package/esm/pkg/commands/zmscore.js +10 -0
  43. package/esm/pkg/commands/zrange.js +6 -0
  44. package/esm/pkg/http.js +100 -3
  45. package/esm/pkg/pipeline.js +179 -12
  46. package/esm/pkg/redis.js +241 -2
  47. package/esm/pkg/script.js +77 -0
  48. package/esm/platforms/cloudflare.js +10 -2
  49. package/esm/platforms/fastly.js +6 -0
  50. package/esm/platforms/node_with_fetch.js +26 -1
  51. package/esm/platforms/nodejs.js +24 -1
  52. package/esm/version.js +1 -0
  53. package/package.json +53 -58
  54. package/script/deps/deno.land/x/base64@v0.2.1/base.js +104 -0
  55. package/script/deps/deno.land/x/base64@v0.2.1/base64url.js +13 -0
  56. package/script/deps/deno.land/x/sha1@v1.0.3/deps.js +6 -0
  57. package/script/deps/deno.land/x/sha1@v1.0.3/mod.js +196 -0
  58. package/script/deps/denopkg.com/chiefbiiko/std-encoding@v1.0.0/mod.js +55 -0
  59. package/script/pkg/commands/command.js +12 -3
  60. package/script/pkg/commands/getdel.js +13 -0
  61. package/script/pkg/commands/hgetall.js +0 -4
  62. package/script/pkg/commands/hrandfield.js +43 -0
  63. package/script/pkg/commands/json_arrappend.js +13 -0
  64. package/script/pkg/commands/json_arrindex.js +13 -0
  65. package/script/pkg/commands/json_arrinsert.js +13 -0
  66. package/script/pkg/commands/json_arrlen.js +13 -0
  67. package/script/pkg/commands/json_arrpop.js +13 -0
  68. package/script/pkg/commands/json_arrtrim.js +16 -0
  69. package/script/pkg/commands/json_clear.js +13 -0
  70. package/script/pkg/commands/json_del.js +13 -0
  71. package/script/pkg/commands/json_forget.js +13 -0
  72. package/script/pkg/commands/json_get.js +34 -0
  73. package/script/pkg/commands/json_mget.js +13 -0
  74. package/script/pkg/commands/json_numincrby.js +13 -0
  75. package/script/pkg/commands/json_nummultby.js +13 -0
  76. package/script/pkg/commands/json_objkeys.js +13 -0
  77. package/script/pkg/commands/json_objlen.js +13 -0
  78. package/script/pkg/commands/json_resp.js +13 -0
  79. package/script/pkg/commands/json_set.js +22 -0
  80. package/script/pkg/commands/json_strappend.js +13 -0
  81. package/script/pkg/commands/json_strlen.js +13 -0
  82. package/script/pkg/commands/json_toggle.js +13 -0
  83. package/script/pkg/commands/json_type.js +13 -0
  84. package/script/pkg/commands/lmove.js +13 -0
  85. package/script/pkg/commands/lpos.js +23 -0
  86. package/script/pkg/commands/mod.js +28 -0
  87. package/script/pkg/commands/scan.js +3 -0
  88. package/script/pkg/commands/sdiffstore.js +1 -1
  89. package/script/pkg/commands/set.js +16 -4
  90. package/script/pkg/commands/smismember.js +13 -0
  91. package/script/pkg/commands/xadd.js +30 -0
  92. package/script/pkg/commands/xrange.js +40 -0
  93. package/script/pkg/commands/zdiffstore.js +13 -0
  94. package/script/pkg/commands/zmscore.js +14 -0
  95. package/script/pkg/commands/zrange.js +6 -0
  96. package/script/pkg/http.js +100 -3
  97. package/script/pkg/pipeline.js +178 -11
  98. package/script/pkg/redis.js +240 -1
  99. package/script/pkg/script.js +81 -0
  100. package/script/platforms/cloudflare.js +10 -2
  101. package/script/platforms/fastly.js +6 -0
  102. package/script/platforms/node_with_fetch.js +26 -1
  103. package/script/platforms/nodejs.js +24 -1
  104. package/script/version.js +4 -0
  105. package/types/deps/deno.land/x/base64@v0.2.1/base.d.ts +5 -0
  106. package/types/deps/deno.land/x/base64@v0.2.1/base64url.d.ts +1 -0
  107. package/types/deps/deno.land/x/sha1@v1.0.3/deps.d.ts +1 -0
  108. package/types/deps/deno.land/x/sha1@v1.0.3/mod.d.ts +26 -0
  109. package/types/deps/denopkg.com/chiefbiiko/std-encoding@v1.0.0/mod.d.ts +3 -0
  110. package/types/pkg/commands/bitop.d.ts +0 -1
  111. package/types/pkg/commands/bitpos.d.ts +1 -1
  112. package/types/pkg/commands/command.d.ts +5 -5
  113. package/types/pkg/commands/getdel.d.ts +7 -0
  114. package/types/pkg/commands/hdel.d.ts +1 -1
  115. package/types/pkg/commands/hrandfield.d.ts +9 -0
  116. package/types/pkg/commands/json_arrappend.d.ts +7 -0
  117. package/types/pkg/commands/json_arrindex.d.ts +13 -0
  118. package/types/pkg/commands/json_arrinsert.d.ts +7 -0
  119. package/types/pkg/commands/json_arrlen.d.ts +7 -0
  120. package/types/pkg/commands/json_arrpop.d.ts +7 -0
  121. package/types/pkg/commands/json_arrtrim.d.ts +7 -0
  122. package/types/pkg/commands/json_clear.d.ts +7 -0
  123. package/types/pkg/commands/json_del.d.ts +7 -0
  124. package/types/pkg/commands/json_forget.d.ts +7 -0
  125. package/types/pkg/commands/json_get.d.ts +15 -0
  126. package/types/pkg/commands/json_mget.d.ts +7 -0
  127. package/types/pkg/commands/json_numincrby.d.ts +7 -0
  128. package/types/pkg/commands/json_nummultby.d.ts +7 -0
  129. package/types/pkg/commands/json_objkeys.d.ts +7 -0
  130. package/types/pkg/commands/json_objlen.d.ts +7 -0
  131. package/types/pkg/commands/json_resp.d.ts +7 -0
  132. package/types/pkg/commands/json_set.d.ts +18 -0
  133. package/types/pkg/commands/json_strappend.d.ts +7 -0
  134. package/types/pkg/commands/json_strlen.d.ts +7 -0
  135. package/types/pkg/commands/json_toggle.d.ts +7 -0
  136. package/types/pkg/commands/json_type.d.ts +7 -0
  137. package/types/pkg/commands/lmove.d.ts +12 -0
  138. package/types/pkg/commands/lpop.d.ts +1 -1
  139. package/types/pkg/commands/lpos.d.ts +15 -0
  140. package/types/pkg/commands/mget.d.ts +1 -1
  141. package/types/pkg/commands/mod.d.ts +28 -0
  142. package/types/pkg/commands/rpop.d.ts +2 -2
  143. package/types/pkg/commands/scan.d.ts +2 -1
  144. package/types/pkg/commands/script_flush.d.ts +1 -1
  145. package/types/pkg/commands/sdiffstore.d.ts +1 -1
  146. package/types/pkg/commands/set.d.ts +31 -2
  147. package/types/pkg/commands/smembers.d.ts +2 -2
  148. package/types/pkg/commands/smismember.d.ts +7 -0
  149. package/types/pkg/commands/spop.d.ts +2 -2
  150. package/types/pkg/commands/type.d.ts +1 -1
  151. package/types/pkg/commands/xadd.d.ts +31 -0
  152. package/types/pkg/commands/xrange.d.ts +9 -0
  153. package/types/pkg/commands/zadd.d.ts +4 -4
  154. package/types/pkg/commands/zdiffstore.d.ts +7 -0
  155. package/types/pkg/commands/zinterstore.d.ts +1 -1
  156. package/types/pkg/commands/zmscore.d.ts +7 -0
  157. package/types/pkg/commands/zrange.d.ts +8 -1
  158. package/types/pkg/commands/zunionstore.d.ts +1 -1
  159. package/types/pkg/http.d.ts +48 -7
  160. package/types/pkg/pipeline.d.ts +262 -124
  161. package/types/pkg/redis.d.ts +187 -19
  162. package/types/pkg/script.d.ts +42 -0
  163. package/types/pkg/types.d.ts +27 -1
  164. package/types/platforms/cloudflare.d.ts +9 -8
  165. package/types/platforms/fastly.d.ts +3 -7
  166. package/types/platforms/node_with_fetch.d.ts +3 -22
  167. package/types/platforms/nodejs.d.ts +4 -7
  168. package/types/version.d.ts +1 -0
@@ -12,6 +12,12 @@ export class ZRangeCommand extends Command {
12
12
  if (opts?.byLex) {
13
13
  command.push("bylex");
14
14
  }
15
+ if (opts?.rev) {
16
+ command.push("rev");
17
+ }
18
+ if (typeof opts?.count !== "undefined" && typeof opts?.offset !== "undefined") {
19
+ command.push("limit", opts.offset, opts.count);
20
+ }
15
21
  if (opts?.withScores) {
16
22
  command.push("withscores");
17
23
  }
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,5 +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, 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, ZUnionStoreCommand, } from "./commands/mod.js";
2
2
  import { UpstashError } from "./error.js";
3
+ import { ZMScoreCommand } from "./commands/zmscore.js";
4
+ import { HRandFieldCommand } from "./commands/hrandfield.js";
5
+ import { ZDiffStoreCommand } from "./commands/zdiffstore.js";
3
6
  /**
4
7
  * Upstash REST API supports command pipelining to send multiple commands in
5
8
  * batch, instead of sending each command one by one and waiting for a response.
@@ -16,7 +19,7 @@ import { UpstashError } from "./error.js";
16
19
  * **Examples:**
17
20
  *
18
21
  * ```ts
19
- * const p = redis.pipeline()
22
+ * const p = redis.pipeline() // or redis.multi()
20
23
  * p.set("key","value")
21
24
  * p.get("key")
22
25
  * const res = await p.exec()
@@ -28,7 +31,7 @@ import { UpstashError } from "./error.js";
28
31
  * const res = await p.set("key","value").get("key").exec()
29
32
  * ```
30
33
  *
31
- * 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
32
35
  * override the response type manually:
33
36
  * ```ts
34
37
  * redis.pipeline()
@@ -39,7 +42,7 @@ import { UpstashError } from "./error.js";
39
42
  * ```
40
43
  */
41
44
  export class Pipeline {
42
- constructor(client, commandOptions) {
45
+ constructor(opts) {
43
46
  Object.defineProperty(this, "client", {
44
47
  enumerable: true,
45
48
  configurable: true,
@@ -58,14 +61,22 @@ export class Pipeline {
58
61
  writable: true,
59
62
  value: void 0
60
63
  });
64
+ Object.defineProperty(this, "multiExec", {
65
+ enumerable: true,
66
+ configurable: true,
67
+ writable: true,
68
+ value: void 0
69
+ });
61
70
  /**
62
71
  * Send the pipeline request to upstash.
63
72
  *
64
73
  * Returns an array with the results of all pipelined commands.
65
74
  *
66
- * 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:
67
76
  * ```ts
68
- * redis.pipeline().get("key").exec<[{ greeting: string }]>()
77
+ * const p = redis.pipeline()
78
+ * p.get("key")
79
+ * const result = p.exec<[{ greeting: string }]>()
69
80
  * ```
70
81
  */
71
82
  Object.defineProperty(this, "exec", {
@@ -76,8 +87,9 @@ export class Pipeline {
76
87
  if (this.commands.length === 0) {
77
88
  throw new Error("Pipeline is empty");
78
89
  }
90
+ const path = this.multiExec ? ["multi-exec"] : ["pipeline"];
79
91
  const res = (await this.client.request({
80
- path: ["pipeline"],
92
+ path,
81
93
  body: Object.values(this.commands).map((c) => c.command),
82
94
  }));
83
95
  return res.map(({ error, result }, i) => {
@@ -124,6 +136,15 @@ export class Pipeline {
124
136
  writable: true,
125
137
  value: (...args) => this.chain(new BitPosCommand(args, this.commandOptions))
126
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
+ });
127
148
  /**
128
149
  * @see https://redis.io/commands/dbsize
129
150
  */
@@ -250,6 +271,15 @@ export class Pipeline {
250
271
  writable: true,
251
272
  value: (...args) => this.chain(new GetBitCommand(args, this.commandOptions))
252
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
+ });
253
283
  /**
254
284
  * @see https://redis.io/commands/getrange
255
285
  */
@@ -358,6 +388,15 @@ export class Pipeline {
358
388
  writable: true,
359
389
  value: (key, kv) => this.chain(new HMSetCommand([key, kv], this.commandOptions))
360
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
+ });
361
400
  /**
362
401
  * @see https://redis.io/commands/hscan
363
402
  */
@@ -466,6 +505,15 @@ export class Pipeline {
466
505
  writable: true,
467
506
  value: (...args) => this.chain(new LLenCommand(args, this.commandOptions))
468
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
+ });
469
517
  /**
470
518
  * @see https://redis.io/commands/lpop
471
519
  */
@@ -475,6 +523,15 @@ export class Pipeline {
475
523
  writable: true,
476
524
  value: (...args) => this.chain(new LPopCommand(args, this.commandOptions))
477
525
  });
526
+ /**
527
+ * @see https://redis.io/commands/lpos
528
+ */
529
+ Object.defineProperty(this, "lpos", {
530
+ enumerable: true,
531
+ configurable: true,
532
+ writable: true,
533
+ value: (...args) => this.chain(new LPosCommand(args, this.commandOptions))
534
+ });
478
535
  /**
479
536
  * @see https://redis.io/commands/lpush
480
537
  */
@@ -826,6 +883,15 @@ export class Pipeline {
826
883
  writable: true,
827
884
  value: (...args) => this.chain(new SMembersCommand(args, this.commandOptions))
828
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
+ });
829
895
  /**
830
896
  * @see https://redis.io/commands/smove
831
897
  */
@@ -1002,6 +1068,15 @@ export class Pipeline {
1002
1068
  writable: true,
1003
1069
  value: (...args) => this.chain(new ZLexCountCommand(args, this.commandOptions))
1004
1070
  });
1071
+ /**
1072
+ * @see https://redis.io/commands/zmscore
1073
+ */
1074
+ Object.defineProperty(this, "zmscore", {
1075
+ enumerable: true,
1076
+ configurable: true,
1077
+ writable: true,
1078
+ value: (...args) => this.chain(new ZMScoreCommand(args, this.commandOptions))
1079
+ });
1005
1080
  /**
1006
1081
  * @see https://redis.io/commands/zpopmax
1007
1082
  */
@@ -1110,16 +1185,108 @@ export class Pipeline {
1110
1185
  writable: true,
1111
1186
  value: (...args) => this.chain(new ZUnionStoreCommand(args, this.commandOptions))
1112
1187
  });
1113
- this.client = client;
1114
- this.commands = [];
1115
- this.commandOptions = commandOptions;
1188
+ this.client = opts.client;
1189
+ 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
1190
+ this.commandOptions = opts.commandOptions;
1191
+ this.multiExec = opts.multiExec ?? false;
1116
1192
  }
1117
1193
  /**
1118
- * Pushes a command into the pipelien and returns a chainable instance of the
1194
+ * Pushes a command into the pipeline and returns a chainable instance of the
1119
1195
  * pipeline
1120
1196
  */
1121
1197
  chain(command) {
1122
1198
  this.commands.push(command);
1123
- return this;
1199
+ return this; // TS thinks we're returning Pipeline<[]> here, because we're not creating a new instance of the class, hence the cast
1200
+ }
1201
+ /**
1202
+ * @see https://redis.io/commands/?group=json
1203
+ */
1204
+ get json() {
1205
+ return {
1206
+ /**
1207
+ * @see https://redis.io/commands/json.arrappend
1208
+ */
1209
+ arrappend: (...args) => this.chain(new JsonArrAppendCommand(args, this.commandOptions)),
1210
+ /**
1211
+ * @see https://redis.io/commands/json.arrindex
1212
+ */
1213
+ arrindex: (...args) => this.chain(new JsonArrIndexCommand(args, this.commandOptions)),
1214
+ /**
1215
+ * @see https://redis.io/commands/json.arrinsert
1216
+ */
1217
+ arrinsert: (...args) => this.chain(new JsonArrInsertCommand(args, this.commandOptions)),
1218
+ /**
1219
+ * @see https://redis.io/commands/json.arrlen
1220
+ */
1221
+ arrlen: (...args) => this.chain(new JsonArrLenCommand(args, this.commandOptions)),
1222
+ /**
1223
+ * @see https://redis.io/commands/json.arrpop
1224
+ */
1225
+ arrpop: (...args) => this.chain(new JsonArrPopCommand(args, this.commandOptions)),
1226
+ /**
1227
+ * @see https://redis.io/commands/json.arrtrim
1228
+ */
1229
+ arrtrim: (...args) => this.chain(new JsonArrTrimCommand(args, this.commandOptions)),
1230
+ /**
1231
+ * @see https://redis.io/commands/json.clear
1232
+ */
1233
+ clear: (...args) => this.chain(new JsonClearCommand(args, this.commandOptions)),
1234
+ /**
1235
+ * @see https://redis.io/commands/json.del
1236
+ */
1237
+ del: (...args) => this.chain(new JsonDelCommand(args, this.commandOptions)),
1238
+ /**
1239
+ * @see https://redis.io/commands/json.forget
1240
+ */
1241
+ forget: (...args) => this.chain(new JsonForgetCommand(args, this.commandOptions)),
1242
+ /**
1243
+ * @see https://redis.io/commands/json.get
1244
+ */
1245
+ get: (...args) => this.chain(new JsonGetCommand(args, this.commandOptions)),
1246
+ /**
1247
+ * @see https://redis.io/commands/json.mget
1248
+ */
1249
+ mget: (...args) => this.chain(new JsonMGetCommand(args, this.commandOptions)),
1250
+ /**
1251
+ * @see https://redis.io/commands/json.numincrby
1252
+ */
1253
+ numincrby: (...args) => this.chain(new JsonNumIncrByCommand(args, this.commandOptions)),
1254
+ /**
1255
+ * @see https://redis.io/commands/json.nummultby
1256
+ */
1257
+ nummultby: (...args) => this.chain(new JsonNumMultByCommand(args, this.commandOptions)),
1258
+ /**
1259
+ * @see https://redis.io/commands/json.objkeys
1260
+ */
1261
+ objkeys: (...args) => this.chain(new JsonObjKeysCommand(args, this.commandOptions)),
1262
+ /**
1263
+ * @see https://redis.io/commands/json.objlen
1264
+ */
1265
+ objlen: (...args) => this.chain(new JsonObjLenCommand(args, this.commandOptions)),
1266
+ /**
1267
+ * @see https://redis.io/commands/json.resp
1268
+ */
1269
+ resp: (...args) => this.chain(new JsonRespCommand(args, this.commandOptions)),
1270
+ /**
1271
+ * @see https://redis.io/commands/json.set
1272
+ */
1273
+ set: (...args) => this.chain(new JsonSetCommand(args, this.commandOptions)),
1274
+ /**
1275
+ * @see https://redis.io/commands/json.strappend
1276
+ */
1277
+ strappend: (...args) => this.chain(new JsonStrAppendCommand(args, this.commandOptions)),
1278
+ /**
1279
+ * @see https://redis.io/commands/json.strlen
1280
+ */
1281
+ strlen: (...args) => this.chain(new JsonStrLenCommand(args, this.commandOptions)),
1282
+ /**
1283
+ * @see https://redis.io/commands/json.toggle
1284
+ */
1285
+ toggle: (...args) => this.chain(new JsonToggleCommand(args, this.commandOptions)),
1286
+ /**
1287
+ * @see https://redis.io/commands/json.type
1288
+ */
1289
+ type: (...args) => this.chain(new JsonTypeCommand(args, this.commandOptions)),
1290
+ };
1124
1291
  }
1125
1292
  }