@upstash/redis 0.0.0-ci.fb6b986f-20221006 → 0.0.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 (128) hide show
  1. package/README.md +20 -18
  2. package/esm/pkg/commands/command.js +12 -3
  3. package/esm/pkg/commands/getdel.js +9 -0
  4. package/esm/pkg/commands/hgetall.js +0 -4
  5. package/esm/pkg/commands/hrandfield.js +39 -0
  6. package/esm/pkg/commands/json_arrappend.js +9 -0
  7. package/esm/pkg/commands/json_arrindex.js +9 -0
  8. package/esm/pkg/commands/json_arrinsert.js +9 -0
  9. package/esm/pkg/commands/json_arrlen.js +9 -0
  10. package/esm/pkg/commands/json_arrpop.js +9 -0
  11. package/esm/pkg/commands/json_arrtrim.js +12 -0
  12. package/esm/pkg/commands/json_clear.js +9 -0
  13. package/esm/pkg/commands/json_del.js +9 -0
  14. package/esm/pkg/commands/json_forget.js +9 -0
  15. package/esm/pkg/commands/json_get.js +30 -0
  16. package/esm/pkg/commands/json_mget.js +9 -0
  17. package/esm/pkg/commands/json_numincrby.js +9 -0
  18. package/esm/pkg/commands/json_nummultby.js +9 -0
  19. package/esm/pkg/commands/json_objkeys.js +9 -0
  20. package/esm/pkg/commands/json_objlen.js +9 -0
  21. package/esm/pkg/commands/json_resp.js +9 -0
  22. package/esm/pkg/commands/json_set.js +18 -0
  23. package/esm/pkg/commands/json_strappend.js +9 -0
  24. package/esm/pkg/commands/json_strlen.js +9 -0
  25. package/esm/pkg/commands/json_toggle.js +9 -0
  26. package/esm/pkg/commands/json_type.js +9 -0
  27. package/esm/pkg/commands/lmove.js +9 -0
  28. package/esm/pkg/commands/mod.js +26 -0
  29. package/esm/pkg/commands/set.js +1 -1
  30. package/esm/pkg/commands/smismember.js +9 -0
  31. package/esm/pkg/commands/xadd.js +26 -0
  32. package/esm/pkg/commands/zdiffstore.js +9 -0
  33. package/esm/pkg/http.js +71 -25
  34. package/esm/pkg/pipeline.js +161 -12
  35. package/esm/pkg/redis.js +192 -2
  36. package/esm/platforms/cloudflare.js +10 -2
  37. package/esm/platforms/fastly.js +6 -0
  38. package/esm/platforms/node_with_fetch.js +26 -1
  39. package/esm/platforms/nodejs.js +24 -1
  40. package/esm/version.js +1 -0
  41. package/package.json +53 -20
  42. package/script/pkg/commands/command.js +12 -3
  43. package/script/pkg/commands/getdel.js +13 -0
  44. package/script/pkg/commands/hgetall.js +0 -4
  45. package/script/pkg/commands/hrandfield.js +43 -0
  46. package/script/pkg/commands/json_arrappend.js +13 -0
  47. package/script/pkg/commands/json_arrindex.js +13 -0
  48. package/script/pkg/commands/json_arrinsert.js +13 -0
  49. package/script/pkg/commands/json_arrlen.js +13 -0
  50. package/script/pkg/commands/json_arrpop.js +13 -0
  51. package/script/pkg/commands/json_arrtrim.js +16 -0
  52. package/script/pkg/commands/json_clear.js +13 -0
  53. package/script/pkg/commands/json_del.js +13 -0
  54. package/script/pkg/commands/json_forget.js +13 -0
  55. package/script/pkg/commands/json_get.js +34 -0
  56. package/script/pkg/commands/json_mget.js +13 -0
  57. package/script/pkg/commands/json_numincrby.js +13 -0
  58. package/script/pkg/commands/json_nummultby.js +13 -0
  59. package/script/pkg/commands/json_objkeys.js +13 -0
  60. package/script/pkg/commands/json_objlen.js +13 -0
  61. package/script/pkg/commands/json_resp.js +13 -0
  62. package/script/pkg/commands/json_set.js +22 -0
  63. package/script/pkg/commands/json_strappend.js +13 -0
  64. package/script/pkg/commands/json_strlen.js +13 -0
  65. package/script/pkg/commands/json_toggle.js +13 -0
  66. package/script/pkg/commands/json_type.js +13 -0
  67. package/script/pkg/commands/lmove.js +13 -0
  68. package/script/pkg/commands/mod.js +26 -0
  69. package/script/pkg/commands/set.js +1 -1
  70. package/script/pkg/commands/smismember.js +13 -0
  71. package/script/pkg/commands/xadd.js +30 -0
  72. package/script/pkg/commands/zdiffstore.js +13 -0
  73. package/script/pkg/http.js +71 -25
  74. package/script/pkg/pipeline.js +160 -11
  75. package/script/pkg/redis.js +191 -1
  76. package/script/platforms/cloudflare.js +10 -2
  77. package/script/platforms/fastly.js +6 -0
  78. package/script/platforms/node_with_fetch.js +26 -1
  79. package/script/platforms/nodejs.js +24 -1
  80. package/script/version.js +4 -0
  81. package/types/pkg/commands/command.d.ts +5 -5
  82. package/types/pkg/commands/getdel.d.ts +7 -0
  83. package/types/pkg/commands/hdel.d.ts +1 -1
  84. package/types/pkg/commands/hrandfield.d.ts +9 -0
  85. package/types/pkg/commands/json_arrappend.d.ts +7 -0
  86. package/types/pkg/commands/json_arrindex.d.ts +13 -0
  87. package/types/pkg/commands/json_arrinsert.d.ts +7 -0
  88. package/types/pkg/commands/json_arrlen.d.ts +7 -0
  89. package/types/pkg/commands/json_arrpop.d.ts +7 -0
  90. package/types/pkg/commands/json_arrtrim.d.ts +7 -0
  91. package/types/pkg/commands/json_clear.d.ts +7 -0
  92. package/types/pkg/commands/json_del.d.ts +7 -0
  93. package/types/pkg/commands/json_forget.d.ts +7 -0
  94. package/types/pkg/commands/json_get.d.ts +15 -0
  95. package/types/pkg/commands/json_mget.d.ts +7 -0
  96. package/types/pkg/commands/json_numincrby.d.ts +7 -0
  97. package/types/pkg/commands/json_nummultby.d.ts +7 -0
  98. package/types/pkg/commands/json_objkeys.d.ts +7 -0
  99. package/types/pkg/commands/json_objlen.d.ts +7 -0
  100. package/types/pkg/commands/json_resp.d.ts +7 -0
  101. package/types/pkg/commands/json_set.d.ts +18 -0
  102. package/types/pkg/commands/json_strappend.d.ts +7 -0
  103. package/types/pkg/commands/json_strlen.d.ts +7 -0
  104. package/types/pkg/commands/json_toggle.d.ts +7 -0
  105. package/types/pkg/commands/json_type.d.ts +7 -0
  106. package/types/pkg/commands/lmove.d.ts +12 -0
  107. package/types/pkg/commands/mod.d.ts +26 -0
  108. package/types/pkg/commands/scan.d.ts +1 -1
  109. package/types/pkg/commands/script_flush.d.ts +1 -1
  110. package/types/pkg/commands/set.d.ts +3 -3
  111. package/types/pkg/commands/smembers.d.ts +2 -2
  112. package/types/pkg/commands/smismember.d.ts +7 -0
  113. package/types/pkg/commands/type.d.ts +1 -1
  114. package/types/pkg/commands/xadd.d.ts +31 -0
  115. package/types/pkg/commands/zadd.d.ts +3 -3
  116. package/types/pkg/commands/zdiffstore.d.ts +7 -0
  117. package/types/pkg/commands/zinterstore.d.ts +1 -1
  118. package/types/pkg/commands/zrange.d.ts +1 -1
  119. package/types/pkg/commands/zunionstore.d.ts +1 -1
  120. package/types/pkg/http.d.ts +48 -7
  121. package/types/pkg/pipeline.d.ts +252 -126
  122. package/types/pkg/redis.d.ts +137 -12
  123. package/types/pkg/types.d.ts +27 -1
  124. package/types/platforms/cloudflare.d.ts +9 -8
  125. package/types/platforms/fastly.d.ts +3 -7
  126. package/types/platforms/node_with_fetch.d.ts +3 -22
  127. package/types/platforms/nodejs.d.ts +4 -7
  128. package/types/version.d.ts +1 -0
package/esm/pkg/http.js CHANGED
@@ -25,13 +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
35
  this.headers = {
30
36
  "Content-Type": "application/json",
31
- "Upstash-Encoding": "base64",
32
37
  ...config.headers,
33
38
  };
34
- this.options = { backend: config.options?.backend };
39
+ if (this.options.responseEncoding === "base64") {
40
+ this.headers["Upstash-Encoding"] = "base64";
41
+ }
35
42
  if (typeof config?.retry === "boolean" && config?.retry === false) {
36
43
  this.retry = {
37
44
  attempts: 1,
@@ -46,12 +53,31 @@ export class HttpClient {
46
53
  };
47
54
  }
48
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
+ }
49
73
  async request(req) {
50
74
  const requestOptions = {
75
+ cache: this.options.cache,
51
76
  method: "POST",
52
77
  headers: this.headers,
53
78
  body: JSON.stringify(req.body),
54
79
  keepalive: true,
80
+ agent: this.options?.agent,
55
81
  /**
56
82
  * Fastly specific
57
83
  */
@@ -74,42 +100,60 @@ export class HttpClient {
74
100
  }
75
101
  const body = (await res.json());
76
102
  if (!res.ok) {
77
- throw new UpstashError(body.error);
103
+ throw new UpstashError(`${body.error}, command was: ${JSON.stringify(req.body)}`);
78
104
  }
79
- return Array.isArray(body) ? body.map(decode) : decode(body);
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 };
114
+ }
115
+ return body;
80
116
  }
81
117
  }
82
118
  function base64decode(b64) {
83
119
  let dec = "";
84
120
  try {
85
- dec = atob(b64).split("").map((c) => "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2)).join("");
86
- }
87
- catch (e) {
88
- console.warn(`Unable to decode base64 [${dec}]: ${e.message}`);
89
- return dec;
90
- }
91
- try {
92
- return decodeURIComponent(dec);
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);
93
131
  }
94
- catch (e) {
95
- console.warn(`Unable to decode URI [${dec}]: ${e.message}`);
96
- return dec;
132
+ catch {
133
+ dec = b64;
97
134
  }
135
+ return dec;
136
+ // try {
137
+ // return decodeURIComponent(dec);
138
+ // } catch {
139
+ // return dec;
140
+ // }
98
141
  }
99
142
  function decode(raw) {
100
143
  let result = undefined;
101
- switch (typeof raw.result) {
144
+ switch (typeof raw) {
102
145
  case "undefined":
103
146
  return raw;
104
- case "number":
105
- result = raw.result;
147
+ case "number": {
148
+ result = raw;
106
149
  break;
107
- case "object":
108
- if (Array.isArray(raw.result)) {
109
- result = raw.result.map((v) => typeof v === "string"
150
+ }
151
+ case "object": {
152
+ if (Array.isArray(raw)) {
153
+ result = raw.map((v) => typeof v === "string"
110
154
  ? base64decode(v)
111
155
  : Array.isArray(v)
112
- ? v.map(base64decode)
156
+ ? v.map(decode)
113
157
  : v);
114
158
  }
115
159
  else {
@@ -118,11 +162,13 @@ function decode(raw) {
118
162
  result = null;
119
163
  }
120
164
  break;
121
- case "string":
122
- result = raw.result === "OK" ? "OK" : base64decode(raw.result);
165
+ }
166
+ case "string": {
167
+ result = raw === "OK" ? "OK" : base64decode(raw);
123
168
  break;
169
+ }
124
170
  default:
125
171
  break;
126
172
  }
127
- return { result, error: raw.error };
173
+ return result;
128
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, 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,10 +87,12 @@ 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
  }));
95
+ console.log("after req", { res });
84
96
  return res.map(({ error, result }, i) => {
85
97
  if (error) {
86
98
  throw new UpstashError(`Command ${i + 1} [ ${this.commands[i].command[0]} ] failed: ${error}`);
@@ -125,6 +137,15 @@ export class Pipeline {
125
137
  writable: true,
126
138
  value: (...args) => this.chain(new BitPosCommand(args, this.commandOptions))
127
139
  });
140
+ /**
141
+ * @see https://redis.io/commands/zdiffstore
142
+ */
143
+ Object.defineProperty(this, "zdiffstore", {
144
+ enumerable: true,
145
+ configurable: true,
146
+ writable: true,
147
+ value: (...args) => this.chain(new ZDiffStoreCommand(args, this.commandOptions))
148
+ });
128
149
  /**
129
150
  * @see https://redis.io/commands/dbsize
130
151
  */
@@ -251,6 +272,15 @@ export class Pipeline {
251
272
  writable: true,
252
273
  value: (...args) => this.chain(new GetBitCommand(args, this.commandOptions))
253
274
  });
275
+ /**
276
+ * @see https://redis.io/commands/getdel
277
+ */
278
+ Object.defineProperty(this, "getdel", {
279
+ enumerable: true,
280
+ configurable: true,
281
+ writable: true,
282
+ value: (...args) => this.chain(new GetDelCommand(args, this.commandOptions))
283
+ });
254
284
  /**
255
285
  * @see https://redis.io/commands/getrange
256
286
  */
@@ -359,6 +389,15 @@ export class Pipeline {
359
389
  writable: true,
360
390
  value: (key, kv) => this.chain(new HMSetCommand([key, kv], this.commandOptions))
361
391
  });
392
+ /**
393
+ * @see https://redis.io/commands/hrandfield
394
+ */
395
+ Object.defineProperty(this, "hrandfield", {
396
+ enumerable: true,
397
+ configurable: true,
398
+ writable: true,
399
+ value: (key, count, withValues) => this.chain(new HRandFieldCommand([key, count, withValues], this.commandOptions))
400
+ });
362
401
  /**
363
402
  * @see https://redis.io/commands/hscan
364
403
  */
@@ -467,6 +506,15 @@ export class Pipeline {
467
506
  writable: true,
468
507
  value: (...args) => this.chain(new LLenCommand(args, this.commandOptions))
469
508
  });
509
+ /**
510
+ * @see https://redis.io/commands/lmove
511
+ */
512
+ Object.defineProperty(this, "lmove", {
513
+ enumerable: true,
514
+ configurable: true,
515
+ writable: true,
516
+ value: (...args) => this.chain(new LMoveCommand(args, this.commandOptions))
517
+ });
470
518
  /**
471
519
  * @see https://redis.io/commands/lpop
472
520
  */
@@ -836,6 +884,15 @@ export class Pipeline {
836
884
  writable: true,
837
885
  value: (...args) => this.chain(new SMembersCommand(args, this.commandOptions))
838
886
  });
887
+ /**
888
+ * @see https://redis.io/commands/smismember
889
+ */
890
+ Object.defineProperty(this, "smismember", {
891
+ enumerable: true,
892
+ configurable: true,
893
+ writable: true,
894
+ value: (key, members) => this.chain(new SMIsMemberCommand([key, members], this.commandOptions))
895
+ });
839
896
  /**
840
897
  * @see https://redis.io/commands/smove
841
898
  */
@@ -1129,16 +1186,108 @@ export class Pipeline {
1129
1186
  writable: true,
1130
1187
  value: (...args) => this.chain(new ZUnionStoreCommand(args, this.commandOptions))
1131
1188
  });
1132
- this.client = client;
1133
- this.commands = [];
1134
- this.commandOptions = commandOptions;
1189
+ this.client = opts.client;
1190
+ 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
1191
+ this.commandOptions = opts.commandOptions;
1192
+ this.multiExec = opts.multiExec ?? false;
1135
1193
  }
1136
1194
  /**
1137
- * Pushes a command into the pipelien and returns a chainable instance of the
1195
+ * Pushes a command into the pipeline and returns a chainable instance of the
1138
1196
  * pipeline
1139
1197
  */
1140
1198
  chain(command) {
1141
1199
  this.commands.push(command);
1142
- return this;
1200
+ return this; // TS thinks we're returning Pipeline<[]> here, because we're not creating a new instance of the class, hence the cast
1201
+ }
1202
+ /**
1203
+ * @see https://redis.io/commands/?group=json
1204
+ */
1205
+ get json() {
1206
+ return {
1207
+ /**
1208
+ * @see https://redis.io/commands/json.arrappend
1209
+ */
1210
+ arrappend: (...args) => this.chain(new JsonArrAppendCommand(args, this.commandOptions)),
1211
+ /**
1212
+ * @see https://redis.io/commands/json.arrindex
1213
+ */
1214
+ arrindex: (...args) => this.chain(new JsonArrIndexCommand(args, this.commandOptions)),
1215
+ /**
1216
+ * @see https://redis.io/commands/json.arrinsert
1217
+ */
1218
+ arrinsert: (...args) => this.chain(new JsonArrInsertCommand(args, this.commandOptions)),
1219
+ /**
1220
+ * @see https://redis.io/commands/json.arrlen
1221
+ */
1222
+ arrlen: (...args) => this.chain(new JsonArrLenCommand(args, this.commandOptions)),
1223
+ /**
1224
+ * @see https://redis.io/commands/json.arrpop
1225
+ */
1226
+ arrpop: (...args) => this.chain(new JsonArrPopCommand(args, this.commandOptions)),
1227
+ /**
1228
+ * @see https://redis.io/commands/json.arrtrim
1229
+ */
1230
+ arrtrim: (...args) => this.chain(new JsonArrTrimCommand(args, this.commandOptions)),
1231
+ /**
1232
+ * @see https://redis.io/commands/json.clear
1233
+ */
1234
+ clear: (...args) => this.chain(new JsonClearCommand(args, this.commandOptions)),
1235
+ /**
1236
+ * @see https://redis.io/commands/json.del
1237
+ */
1238
+ del: (...args) => this.chain(new JsonDelCommand(args, this.commandOptions)),
1239
+ /**
1240
+ * @see https://redis.io/commands/json.forget
1241
+ */
1242
+ forget: (...args) => this.chain(new JsonForgetCommand(args, this.commandOptions)),
1243
+ /**
1244
+ * @see https://redis.io/commands/json.get
1245
+ */
1246
+ get: (...args) => this.chain(new JsonGetCommand(args, this.commandOptions)),
1247
+ /**
1248
+ * @see https://redis.io/commands/json.mget
1249
+ */
1250
+ mget: (...args) => this.chain(new JsonMGetCommand(args, this.commandOptions)),
1251
+ /**
1252
+ * @see https://redis.io/commands/json.numincrby
1253
+ */
1254
+ numincrby: (...args) => this.chain(new JsonNumIncrByCommand(args, this.commandOptions)),
1255
+ /**
1256
+ * @see https://redis.io/commands/json.nummultby
1257
+ */
1258
+ nummultby: (...args) => this.chain(new JsonNumMultByCommand(args, this.commandOptions)),
1259
+ /**
1260
+ * @see https://redis.io/commands/json.objkeys
1261
+ */
1262
+ objkeys: (...args) => this.chain(new JsonObjKeysCommand(args, this.commandOptions)),
1263
+ /**
1264
+ * @see https://redis.io/commands/json.objlen
1265
+ */
1266
+ objlen: (...args) => this.chain(new JsonObjLenCommand(args, this.commandOptions)),
1267
+ /**
1268
+ * @see https://redis.io/commands/json.resp
1269
+ */
1270
+ resp: (...args) => this.chain(new JsonRespCommand(args, this.commandOptions)),
1271
+ /**
1272
+ * @see https://redis.io/commands/json.set
1273
+ */
1274
+ set: (...args) => this.chain(new JsonSetCommand(args, this.commandOptions)),
1275
+ /**
1276
+ * @see https://redis.io/commands/json.strappend
1277
+ */
1278
+ strappend: (...args) => this.chain(new JsonStrAppendCommand(args, this.commandOptions)),
1279
+ /**
1280
+ * @see https://redis.io/commands/json.strlen
1281
+ */
1282
+ strlen: (...args) => this.chain(new JsonStrLenCommand(args, this.commandOptions)),
1283
+ /**
1284
+ * @see https://redis.io/commands/json.toggle
1285
+ */
1286
+ toggle: (...args) => this.chain(new JsonToggleCommand(args, this.commandOptions)),
1287
+ /**
1288
+ * @see https://redis.io/commands/json.type
1289
+ */
1290
+ type: (...args) => this.chain(new JsonTypeCommand(args, this.commandOptions)),
1291
+ };
1143
1292
  }
1144
1293
  }