@upstash/redis 0.0.0-ci.97cb5577-20231010 → 0.0.0-ci.9d88b94d-20231018

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.
@@ -0,0 +1,27 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/geoadd
4
+ */
5
+ export class GeoAddCommand extends Command {
6
+ constructor([key, arg1, ...arg2], opts) {
7
+ const command = ["geoadd", key];
8
+ if ("nx" in arg1 && arg1.nx) {
9
+ command.push("nx");
10
+ }
11
+ else if ("xx" in arg1 && arg1.xx) {
12
+ command.push("xx");
13
+ }
14
+ if ("ch" in arg1 && arg1.ch) {
15
+ command.push("ch");
16
+ }
17
+ if ("latitude" in arg1 && arg1.latitude) {
18
+ command.push(arg1.longitude, arg1.latitude, arg1.member);
19
+ }
20
+ command.push(...arg2.flatMap(({ latitude, longitude, member }) => [
21
+ longitude,
22
+ latitude,
23
+ member,
24
+ ]));
25
+ super(command, opts);
26
+ }
27
+ }
@@ -0,0 +1,26 @@
1
+ import { Command } from "./command.js";
2
+ /**
3
+ * @see https://redis.io/commands/geopos
4
+ */
5
+ export class GeoPosCommand extends Command {
6
+ constructor(cmd, opts) {
7
+ const [key] = cmd;
8
+ // Check if the second argument is an array of strings (members).
9
+ // If it is, use it directly; if not, it means the members were passed individually,
10
+ // so we slice the cmd from the second element onwards to get the members.
11
+ const members = Array.isArray(cmd[1]) ? cmd[1] : cmd.slice(1);
12
+ super(["GEOPOS", key, ...members], {
13
+ deserialize: (result) => transform(result),
14
+ ...opts,
15
+ });
16
+ }
17
+ }
18
+ function transform(result) {
19
+ const final = [];
20
+ for (const pos of result) {
21
+ if (!pos?.[0] || !pos?.[1])
22
+ continue;
23
+ final.push({ lng: pos[0], lat: pos[1] });
24
+ }
25
+ return final;
26
+ }
@@ -8,7 +8,15 @@ function deserialize(result) {
8
8
  const key = result.shift();
9
9
  const value = result.shift();
10
10
  try {
11
- obj[key] = JSON.parse(value);
11
+ // handle unsafe integer
12
+ const valueIsNumberAndNotSafeInteger = !isNaN(Number(value)) &&
13
+ !Number.isSafeInteger(value);
14
+ if (valueIsNumberAndNotSafeInteger) {
15
+ obj[key] = value;
16
+ }
17
+ else {
18
+ obj[key] = JSON.parse(value);
19
+ }
12
20
  }
13
21
  catch {
14
22
  obj[key] = value;
@@ -15,6 +15,8 @@ export * from "./expire.js";
15
15
  export * from "./expireat.js";
16
16
  export * from "./flushall.js";
17
17
  export * from "./flushdb.js";
18
+ export * from "./geo_add.js";
19
+ export * from "./geo_pos.js";
18
20
  export * from "./get.js";
19
21
  export * from "./getbit.js";
20
22
  export * from "./getdel.js";
@@ -120,7 +122,6 @@ export * from "./touch.js";
120
122
  export * from "./ttl.js";
121
123
  export * from "./type.js";
122
124
  export * from "./unlink.js";
123
- export * from "./xadd.js";
124
125
  export * from "./zadd.js";
125
126
  export * from "./zcard.js";
126
127
  export * from "./zcount.js";
@@ -138,4 +139,7 @@ export * from "./zremrangebyscore.js";
138
139
  export * from "./zrevrank.js";
139
140
  export * from "./zscan.js";
140
141
  export * from "./zscore.js";
142
+ export * from "./zunion.js";
141
143
  export * from "./zunionstore.js";
144
+ export * from "./xadd.js";
145
+ export * from "./xrange.js";
@@ -0,0 +1,36 @@
1
+ import { Command } from "./command.js";
2
+ function deserialize(result) {
3
+ const obj = {};
4
+ for (const e of result) {
5
+ while (e.length >= 2) {
6
+ const streamId = e.shift();
7
+ const entries = e.shift();
8
+ if (!(streamId in obj)) {
9
+ obj[streamId] = {};
10
+ }
11
+ while (entries.length >= 2) {
12
+ const field = entries.shift();
13
+ const value = entries.shift();
14
+ try {
15
+ obj[streamId][field] = JSON.parse(value);
16
+ }
17
+ catch {
18
+ obj[streamId][field] = value;
19
+ }
20
+ }
21
+ }
22
+ }
23
+ return obj;
24
+ }
25
+ export class XRangeCommand extends Command {
26
+ constructor([key, start, end, count], opts) {
27
+ const command = ["XRANGE", key, start, end];
28
+ if (typeof count === "number") {
29
+ command.push("COUNT", count);
30
+ }
31
+ super(command, {
32
+ deserialize: (result) => deserialize(result),
33
+ ...opts,
34
+ });
35
+ }
36
+ }
@@ -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
+ }
@@ -1,4 +1,4 @@
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";
1
+ import { AppendCommand, BitCountCommand, BitOpCommand, BitPosCommand, DBSizeCommand, DecrByCommand, DecrCommand, DelCommand, EchoCommand, EvalCommand, EvalshaCommand, ExistsCommand, ExpireAtCommand, ExpireCommand, FlushAllCommand, FlushDBCommand, GeoPosCommand, 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
4
  import { HRandFieldCommand } from "./commands/hrandfield.js";
@@ -92,7 +92,6 @@ export class Pipeline {
92
92
  path,
93
93
  body: Object.values(this.commands).map((c) => c.command),
94
94
  }));
95
- console.log("after req", { res });
96
95
  return res.map(({ error, result }, i) => {
97
96
  if (error) {
98
97
  throw new UpstashError(`Command ${i + 1} [ ${this.commands[i].command[0]} ] failed: ${error}`);
@@ -1186,11 +1185,26 @@ export class Pipeline {
1186
1185
  writable: true,
1187
1186
  value: (...args) => this.chain(new ZUnionStoreCommand(args, this.commandOptions))
1188
1187
  });
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
+ });
1189
1197
  this.client = opts.client;
1190
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
1191
1199
  this.commandOptions = opts.commandOptions;
1192
1200
  this.multiExec = opts.multiExec ?? false;
1193
1201
  }
1202
+ /**
1203
+ * Returns the length of pipeline before the execution
1204
+ */
1205
+ length() {
1206
+ return this.commands.length;
1207
+ }
1194
1208
  /**
1195
1209
  * Pushes a command into the pipeline and returns a chainable instance of the
1196
1210
  * pipeline
@@ -1240,6 +1254,10 @@ export class Pipeline {
1240
1254
  * @see https://redis.io/commands/json.forget
1241
1255
  */
1242
1256
  forget: (...args) => this.chain(new JsonForgetCommand(args, this.commandOptions)),
1257
+ /**
1258
+ * @see https://redis.io/commands/geopos
1259
+ */
1260
+ geopos: (...args) => new GeoPosCommand(args, this.commandOptions).exec(this.client),
1243
1261
  /**
1244
1262
  * @see https://redis.io/commands/json.get
1245
1263
  */
package/esm/pkg/redis.js CHANGED
@@ -1,4 +1,4 @@
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, HRandFieldCommand, 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";
1
+ import { AppendCommand, BitCountCommand, BitOpCommand, BitPosCommand, DBSizeCommand, DecrByCommand, DecrCommand, DelCommand, EchoCommand, EvalCommand, EvalshaCommand, ExistsCommand, ExpireAtCommand, ExpireCommand, FlushAllCommand, FlushDBCommand, GeoAddCommand, GeoPosCommand, GetBitCommand, GetCommand, GetDelCommand, GetRangeCommand, GetSetCommand, HDelCommand, HExistsCommand, HGetAllCommand, HGetCommand, HIncrByCommand, HIncrByFloatCommand, HKeysCommand, HLenCommand, HMGetCommand, HMSetCommand, HRandFieldCommand, 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, XAddCommand, XRangeCommand, 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 { Pipeline } from "./pipeline.js";
3
3
  import { Script } from "./script.js";
4
4
  import { ZMScoreCommand } from "./commands/zmscore.js";
@@ -1005,10 +1005,24 @@ export class Redis {
1005
1005
  writable: true,
1006
1006
  value: (...args) => new UnlinkCommand(args, this.opts).exec(this.client)
1007
1007
  });
1008
- // /**
1009
- // * @see https://redis.io/commands/xadd
1010
- // */
1011
- // xadd =
1008
+ /**
1009
+ * @see https://redis.io/commands/xadd
1010
+ */
1011
+ Object.defineProperty(this, "xadd", {
1012
+ enumerable: true,
1013
+ configurable: true,
1014
+ writable: true,
1015
+ value: (...args) => new XAddCommand(args, this.opts).exec(this.client)
1016
+ });
1017
+ /**
1018
+ * @see https://redis.io/commands/xrange
1019
+ */
1020
+ Object.defineProperty(this, "xrange", {
1021
+ enumerable: true,
1022
+ configurable: true,
1023
+ writable: true,
1024
+ value: (...args) => new XRangeCommand(args, this.opts).exec(this.client)
1025
+ });
1012
1026
  /**
1013
1027
  * @see https://redis.io/commands/zadd
1014
1028
  */
@@ -1185,6 +1199,15 @@ export class Redis {
1185
1199
  writable: true,
1186
1200
  value: (key, member) => new ZScoreCommand([key, member], this.opts).exec(this.client)
1187
1201
  });
1202
+ /**
1203
+ * @see https://redis.io/commands/zunion
1204
+ */
1205
+ Object.defineProperty(this, "zunion", {
1206
+ enumerable: true,
1207
+ configurable: true,
1208
+ writable: true,
1209
+ value: (...args) => new ZUnionCommand(args, this.opts).exec(this.client)
1210
+ });
1188
1211
  /**
1189
1212
  * @see https://redis.io/commands/zunionstore
1190
1213
  */
@@ -1236,6 +1259,14 @@ export class Redis {
1236
1259
  * @see https://redis.io/commands/json.forget
1237
1260
  */
1238
1261
  forget: (...args) => new JsonForgetCommand(args, this.opts).exec(this.client),
1262
+ /**
1263
+ * @see https://redis.io/commands/geoadd
1264
+ */
1265
+ geoadd: (...args) => new GeoAddCommand(args, this.opts).exec(this.client),
1266
+ /**
1267
+ * @see https://redis.io/commands/geopos
1268
+ */
1269
+ geopos: (...args) => new GeoPosCommand(args, this.opts).exec(this.client),
1239
1270
  /**
1240
1271
  * @see https://redis.io/commands/json.get
1241
1272
  */
package/esm/version.js CHANGED
@@ -1 +1 @@
1
- export const VERSION = "v0.0.0-ci.97cb5577-20231010";
1
+ export const VERSION = "v0.0.0-ci.9d88b94d-20231018";
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "main": "./script/platforms/nodejs.js",
4
4
  "types": "./types/platforms/nodejs.d.ts",
5
5
  "name": "@upstash/redis",
6
- "version": "v0.0.0-ci.97cb5577-20231010",
6
+ "version": "v0.0.0-ci.9d88b94d-20231018",
7
7
  "description": "An HTTP/REST based Redis client built on top of Upstash REST API.",
8
8
  "repository": {
9
9
  "type": "git",
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GeoAddCommand = void 0;
4
+ const command_js_1 = require("./command.js");
5
+ /**
6
+ * @see https://redis.io/commands/geoadd
7
+ */
8
+ class GeoAddCommand extends command_js_1.Command {
9
+ constructor([key, arg1, ...arg2], opts) {
10
+ const command = ["geoadd", key];
11
+ if ("nx" in arg1 && arg1.nx) {
12
+ command.push("nx");
13
+ }
14
+ else if ("xx" in arg1 && arg1.xx) {
15
+ command.push("xx");
16
+ }
17
+ if ("ch" in arg1 && arg1.ch) {
18
+ command.push("ch");
19
+ }
20
+ if ("latitude" in arg1 && arg1.latitude) {
21
+ command.push(arg1.longitude, arg1.latitude, arg1.member);
22
+ }
23
+ command.push(...arg2.flatMap(({ latitude, longitude, member }) => [
24
+ longitude,
25
+ latitude,
26
+ member,
27
+ ]));
28
+ super(command, opts);
29
+ }
30
+ }
31
+ exports.GeoAddCommand = GeoAddCommand;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GeoPosCommand = void 0;
4
+ const command_js_1 = require("./command.js");
5
+ /**
6
+ * @see https://redis.io/commands/geopos
7
+ */
8
+ class GeoPosCommand extends command_js_1.Command {
9
+ constructor(cmd, opts) {
10
+ const [key] = cmd;
11
+ // Check if the second argument is an array of strings (members).
12
+ // If it is, use it directly; if not, it means the members were passed individually,
13
+ // so we slice the cmd from the second element onwards to get the members.
14
+ const members = Array.isArray(cmd[1]) ? cmd[1] : cmd.slice(1);
15
+ super(["GEOPOS", key, ...members], {
16
+ deserialize: (result) => transform(result),
17
+ ...opts,
18
+ });
19
+ }
20
+ }
21
+ exports.GeoPosCommand = GeoPosCommand;
22
+ function transform(result) {
23
+ const final = [];
24
+ for (const pos of result) {
25
+ if (!pos?.[0] || !pos?.[1])
26
+ continue;
27
+ final.push({ lng: pos[0], lat: pos[1] });
28
+ }
29
+ return final;
30
+ }
@@ -11,7 +11,15 @@ function deserialize(result) {
11
11
  const key = result.shift();
12
12
  const value = result.shift();
13
13
  try {
14
- obj[key] = JSON.parse(value);
14
+ // handle unsafe integer
15
+ const valueIsNumberAndNotSafeInteger = !isNaN(Number(value)) &&
16
+ !Number.isSafeInteger(value);
17
+ if (valueIsNumberAndNotSafeInteger) {
18
+ obj[key] = value;
19
+ }
20
+ else {
21
+ obj[key] = JSON.parse(value);
22
+ }
15
23
  }
16
24
  catch {
17
25
  obj[key] = value;
@@ -31,6 +31,8 @@ __exportStar(require("./expire.js"), exports);
31
31
  __exportStar(require("./expireat.js"), exports);
32
32
  __exportStar(require("./flushall.js"), exports);
33
33
  __exportStar(require("./flushdb.js"), exports);
34
+ __exportStar(require("./geo_add.js"), exports);
35
+ __exportStar(require("./geo_pos.js"), exports);
34
36
  __exportStar(require("./get.js"), exports);
35
37
  __exportStar(require("./getbit.js"), exports);
36
38
  __exportStar(require("./getdel.js"), exports);
@@ -136,7 +138,6 @@ __exportStar(require("./touch.js"), exports);
136
138
  __exportStar(require("./ttl.js"), exports);
137
139
  __exportStar(require("./type.js"), exports);
138
140
  __exportStar(require("./unlink.js"), exports);
139
- __exportStar(require("./xadd.js"), exports);
140
141
  __exportStar(require("./zadd.js"), exports);
141
142
  __exportStar(require("./zcard.js"), exports);
142
143
  __exportStar(require("./zcount.js"), exports);
@@ -154,4 +155,7 @@ __exportStar(require("./zremrangebyscore.js"), exports);
154
155
  __exportStar(require("./zrevrank.js"), exports);
155
156
  __exportStar(require("./zscan.js"), exports);
156
157
  __exportStar(require("./zscore.js"), exports);
158
+ __exportStar(require("./zunion.js"), exports);
157
159
  __exportStar(require("./zunionstore.js"), exports);
160
+ __exportStar(require("./xadd.js"), exports);
161
+ __exportStar(require("./xrange.js"), exports);
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.XRangeCommand = void 0;
4
+ const command_js_1 = require("./command.js");
5
+ function deserialize(result) {
6
+ const obj = {};
7
+ for (const e of result) {
8
+ while (e.length >= 2) {
9
+ const streamId = e.shift();
10
+ const entries = e.shift();
11
+ if (!(streamId in obj)) {
12
+ obj[streamId] = {};
13
+ }
14
+ while (entries.length >= 2) {
15
+ const field = entries.shift();
16
+ const value = entries.shift();
17
+ try {
18
+ obj[streamId][field] = JSON.parse(value);
19
+ }
20
+ catch {
21
+ obj[streamId][field] = value;
22
+ }
23
+ }
24
+ }
25
+ }
26
+ return obj;
27
+ }
28
+ class XRangeCommand extends command_js_1.Command {
29
+ constructor([key, start, end, count], opts) {
30
+ const command = ["XRANGE", key, start, end];
31
+ if (typeof count === "number") {
32
+ command.push("COUNT", count);
33
+ }
34
+ super(command, {
35
+ deserialize: (result) => deserialize(result),
36
+ ...opts,
37
+ });
38
+ }
39
+ }
40
+ exports.XRangeCommand = XRangeCommand;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ZUnionCommand = void 0;
4
+ const command_js_1 = require("./command.js");
5
+ /**
6
+ * @see https://redis.io/commands/zunion
7
+ */
8
+ class ZUnionCommand extends command_js_1.Command {
9
+ constructor([numKeys, keyOrKeys, opts], cmdOpts) {
10
+ const command = ["zunion", numKeys];
11
+ if (Array.isArray(keyOrKeys)) {
12
+ command.push(...keyOrKeys);
13
+ }
14
+ else {
15
+ command.push(keyOrKeys);
16
+ }
17
+ if (opts) {
18
+ if ("weights" in opts && opts.weights) {
19
+ command.push("weights", ...opts.weights);
20
+ }
21
+ else if ("weight" in opts && typeof opts.weight === "number") {
22
+ command.push("weights", opts.weight);
23
+ }
24
+ if ("aggregate" in opts) {
25
+ command.push("aggregate", opts.aggregate);
26
+ }
27
+ if (opts?.withScores) {
28
+ command.push("withscores");
29
+ }
30
+ }
31
+ super(command, cmdOpts);
32
+ }
33
+ }
34
+ exports.ZUnionCommand = ZUnionCommand;
@@ -95,7 +95,6 @@ class Pipeline {
95
95
  path,
96
96
  body: Object.values(this.commands).map((c) => c.command),
97
97
  }));
98
- console.log("after req", { res });
99
98
  return res.map(({ error, result }, i) => {
100
99
  if (error) {
101
100
  throw new error_js_1.UpstashError(`Command ${i + 1} [ ${this.commands[i].command[0]} ] failed: ${error}`);
@@ -1189,11 +1188,26 @@ class Pipeline {
1189
1188
  writable: true,
1190
1189
  value: (...args) => this.chain(new mod_js_1.ZUnionStoreCommand(args, this.commandOptions))
1191
1190
  });
1191
+ /**
1192
+ * @see https://redis.io/commands/zunion
1193
+ */
1194
+ Object.defineProperty(this, "zunion", {
1195
+ enumerable: true,
1196
+ configurable: true,
1197
+ writable: true,
1198
+ value: (...args) => this.chain(new mod_js_1.ZUnionCommand(args, this.commandOptions))
1199
+ });
1192
1200
  this.client = opts.client;
1193
1201
  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
1194
1202
  this.commandOptions = opts.commandOptions;
1195
1203
  this.multiExec = opts.multiExec ?? false;
1196
1204
  }
1205
+ /**
1206
+ * Returns the length of pipeline before the execution
1207
+ */
1208
+ length() {
1209
+ return this.commands.length;
1210
+ }
1197
1211
  /**
1198
1212
  * Pushes a command into the pipeline and returns a chainable instance of the
1199
1213
  * pipeline
@@ -1243,6 +1257,10 @@ class Pipeline {
1243
1257
  * @see https://redis.io/commands/json.forget
1244
1258
  */
1245
1259
  forget: (...args) => this.chain(new mod_js_1.JsonForgetCommand(args, this.commandOptions)),
1260
+ /**
1261
+ * @see https://redis.io/commands/geopos
1262
+ */
1263
+ geopos: (...args) => new mod_js_1.GeoPosCommand(args, this.commandOptions).exec(this.client),
1246
1264
  /**
1247
1265
  * @see https://redis.io/commands/json.get
1248
1266
  */
@@ -1008,10 +1008,24 @@ class Redis {
1008
1008
  writable: true,
1009
1009
  value: (...args) => new mod_js_1.UnlinkCommand(args, this.opts).exec(this.client)
1010
1010
  });
1011
- // /**
1012
- // * @see https://redis.io/commands/xadd
1013
- // */
1014
- // xadd =
1011
+ /**
1012
+ * @see https://redis.io/commands/xadd
1013
+ */
1014
+ Object.defineProperty(this, "xadd", {
1015
+ enumerable: true,
1016
+ configurable: true,
1017
+ writable: true,
1018
+ value: (...args) => new mod_js_1.XAddCommand(args, this.opts).exec(this.client)
1019
+ });
1020
+ /**
1021
+ * @see https://redis.io/commands/xrange
1022
+ */
1023
+ Object.defineProperty(this, "xrange", {
1024
+ enumerable: true,
1025
+ configurable: true,
1026
+ writable: true,
1027
+ value: (...args) => new mod_js_1.XRangeCommand(args, this.opts).exec(this.client)
1028
+ });
1015
1029
  /**
1016
1030
  * @see https://redis.io/commands/zadd
1017
1031
  */
@@ -1188,6 +1202,15 @@ class Redis {
1188
1202
  writable: true,
1189
1203
  value: (key, member) => new mod_js_1.ZScoreCommand([key, member], this.opts).exec(this.client)
1190
1204
  });
1205
+ /**
1206
+ * @see https://redis.io/commands/zunion
1207
+ */
1208
+ Object.defineProperty(this, "zunion", {
1209
+ enumerable: true,
1210
+ configurable: true,
1211
+ writable: true,
1212
+ value: (...args) => new mod_js_1.ZUnionCommand(args, this.opts).exec(this.client)
1213
+ });
1191
1214
  /**
1192
1215
  * @see https://redis.io/commands/zunionstore
1193
1216
  */
@@ -1239,6 +1262,14 @@ class Redis {
1239
1262
  * @see https://redis.io/commands/json.forget
1240
1263
  */
1241
1264
  forget: (...args) => new mod_js_1.JsonForgetCommand(args, this.opts).exec(this.client),
1265
+ /**
1266
+ * @see https://redis.io/commands/geoadd
1267
+ */
1268
+ geoadd: (...args) => new mod_js_1.GeoAddCommand(args, this.opts).exec(this.client),
1269
+ /**
1270
+ * @see https://redis.io/commands/geopos
1271
+ */
1272
+ geopos: (...args) => new mod_js_1.GeoPosCommand(args, this.opts).exec(this.client),
1242
1273
  /**
1243
1274
  * @see https://redis.io/commands/json.get
1244
1275
  */
package/script/version.js CHANGED
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
- exports.VERSION = "v0.0.0-ci.97cb5577-20231010";
4
+ exports.VERSION = "v0.0.0-ci.9d88b94d-20231018";
@@ -0,0 +1,25 @@
1
+ import { Command, CommandOptions } from "./command.js";
2
+ export type GeoAddCommandOptions = {
3
+ nx?: boolean;
4
+ xx?: never;
5
+ } | ({
6
+ nx?: never;
7
+ xx?: boolean;
8
+ } & {
9
+ ch?: boolean;
10
+ });
11
+ export interface GeoMember<TMemberType> {
12
+ latitude: number;
13
+ longitude: number;
14
+ member: TMemberType;
15
+ }
16
+ /**
17
+ * @see https://redis.io/commands/geoadd
18
+ */
19
+ export declare class GeoAddCommand<TMemberType = string> extends Command<number | null, number | null> {
20
+ constructor([key, arg1, ...arg2]: [
21
+ string,
22
+ GeoMember<TMemberType> | GeoAddCommandOptions,
23
+ ...GeoMember<TMemberType>[]
24
+ ], opts?: CommandOptions<number | null, number | null>);
25
+ }
@@ -0,0 +1,12 @@
1
+ import { Command, CommandOptions } from "./command.js";
2
+ type Coordinates = {
3
+ lng: string;
4
+ lat: string;
5
+ };
6
+ /**
7
+ * @see https://redis.io/commands/geopos
8
+ */
9
+ export declare class GeoPosCommand<TData extends Coordinates[]> extends Command<(string | null)[][], TData> {
10
+ constructor(cmd: [string, ...string[]] | [string, string[]], opts?: CommandOptions<(string | null)[][], TData>);
11
+ }
12
+ export {};
@@ -15,6 +15,8 @@ export * from "./expire.js";
15
15
  export * from "./expireat.js";
16
16
  export * from "./flushall.js";
17
17
  export * from "./flushdb.js";
18
+ export * from "./geo_add.js";
19
+ export * from "./geo_pos.js";
18
20
  export * from "./get.js";
19
21
  export * from "./getbit.js";
20
22
  export * from "./getdel.js";
@@ -120,7 +122,6 @@ export * from "./touch.js";
120
122
  export * from "./ttl.js";
121
123
  export * from "./type.js";
122
124
  export * from "./unlink.js";
123
- export * from "./xadd.js";
124
125
  export * from "./zadd.js";
125
126
  export * from "./zcard.js";
126
127
  export * from "./zcount.js";
@@ -138,4 +139,7 @@ export * from "./zremrangebyscore.js";
138
139
  export * from "./zrevrank.js";
139
140
  export * from "./zscan.js";
140
141
  export * from "./zscore.js";
142
+ export * from "./zunion.js";
141
143
  export * from "./zunionstore.js";
144
+ export * from "./xadd.js";
145
+ export * from "./xrange.js";
@@ -0,0 +1,9 @@
1
+ import { Command, CommandOptions } from "./command.js";
2
+ export declare class XRangeCommand<TData extends Record<string, Record<string, unknown>>> extends Command<string[][], TData> {
3
+ constructor([key, start, end, count]: [
4
+ key: string,
5
+ start: string,
6
+ end: string,
7
+ count?: number
8
+ ], opts?: CommandOptions<unknown[], TData[]>);
9
+ }
@@ -0,0 +1,29 @@
1
+ import { Command, CommandOptions } from "./command.js";
2
+ export type ZUnionCommandOptions = {
3
+ withScores?: boolean;
4
+ aggregate?: "sum" | "min" | "max";
5
+ } & ({
6
+ weight: number;
7
+ weights?: never;
8
+ } | {
9
+ weight?: never;
10
+ weights: number[];
11
+ } | {
12
+ weight?: never;
13
+ weights?: never;
14
+ });
15
+ /**
16
+ * @see https://redis.io/commands/zunion
17
+ */
18
+ export declare class ZUnionCommand<TData extends unknown[]> extends Command<string[], TData> {
19
+ constructor(cmd: [
20
+ numKeys: 1,
21
+ key: string,
22
+ opts?: ZUnionCommandOptions
23
+ ], cmdOpts?: CommandOptions<string[], TData>);
24
+ constructor(cmd: [
25
+ numKeys: number,
26
+ keys: string[],
27
+ opts?: ZUnionCommandOptions
28
+ ], cmdOpts?: CommandOptions<string[], TData>);
29
+ }
@@ -1,4 +1,4 @@
1
- import { BitOpCommand, DelCommand, ExistsCommand, FlushAllCommand, JsonGetCommand, MGetCommand, PingCommand, ScoreMember, ScriptExistsCommand, SetCommandOptions, TouchCommand, UnlinkCommand, ZAddCommandOptions, ZAddCommandOptionsWithIncr, ZRangeCommandOptions } from "./commands/mod.js";
1
+ import { BitOpCommand, DelCommand, ExistsCommand, FlushAllCommand, GeoPosCommand, JsonGetCommand, MGetCommand, PingCommand, ScoreMember, ScriptExistsCommand, SetCommandOptions, TouchCommand, UnlinkCommand, ZAddCommandOptions, ZAddCommandOptionsWithIncr, ZRangeCommandOptions } from "./commands/mod.js";
2
2
  import { Command, CommandOptions } from "./commands/command.js";
3
3
  import { Requester } from "./http.js";
4
4
  import { CommandArgs } from "./types.js";
@@ -66,6 +66,10 @@ export declare class Pipeline<TCommands extends Command<any, any>[] = []> {
66
66
  * ```
67
67
  */
68
68
  exec: <TCommandResults extends unknown[] = [] extends TCommands ? unknown[] : InferResponseData<TCommands>>() => Promise<TCommandResults>;
69
+ /**
70
+ * Returns the length of pipeline before the execution
71
+ */
72
+ length(): number;
69
73
  /**
70
74
  * Pushes a command into the pipeline and returns a chainable instance of the
71
75
  * pipeline
@@ -579,6 +583,10 @@ export declare class Pipeline<TCommands extends Command<any, any>[] = []> {
579
583
  * @see https://redis.io/commands/zunionstore
580
584
  */
581
585
  zunionstore: (destination: string, numKeys: number, keys: string[], opts?: import("./commands/zunionstore.js").ZUnionStoreCommandOptions | undefined) => Pipeline<[...TCommands, Command<any, number>]>;
586
+ /**
587
+ * @see https://redis.io/commands/zunion
588
+ */
589
+ zunion: (numKeys: number, keys: string[], opts?: import("./commands/zunion.js").ZUnionCommandOptions | undefined) => Pipeline<[...TCommands, Command<any, any>]>;
582
590
  /**
583
591
  * @see https://redis.io/commands/?group=json
584
592
  */
@@ -619,6 +627,10 @@ export declare class Pipeline<TCommands extends Command<any, any>[] = []> {
619
627
  * @see https://redis.io/commands/json.forget
620
628
  */
621
629
  forget: (key: string, path?: string | undefined) => Pipeline<[...TCommands, Command<any, number>]>;
630
+ /**
631
+ * @see https://redis.io/commands/geopos
632
+ */
633
+ geopos: (...args: CommandArgs<typeof GeoPosCommand>) => Promise<any>;
622
634
  /**
623
635
  * @see https://redis.io/commands/json.get
624
636
  */
@@ -1,4 +1,4 @@
1
- import { CommandOptions, DelCommand, ExistsCommand, FlushAllCommand, JsonGetCommand, MGetCommand, PingCommand, ScoreMember, ScriptExistsCommand, SetCommandOptions, TouchCommand, UnlinkCommand, ZAddCommandOptions, ZAddCommandOptionsWithIncr, ZRangeCommandOptions } from "./commands/mod.js";
1
+ import { CommandOptions, DelCommand, ExistsCommand, FlushAllCommand, GeoPosCommand, JsonGetCommand, MGetCommand, PingCommand, ScoreMember, ScriptExistsCommand, SetCommandOptions, TouchCommand, UnlinkCommand, ZAddCommandOptions, ZAddCommandOptionsWithIncr, ZRangeCommandOptions } from "./commands/mod.js";
2
2
  import { Requester, UpstashRequest, UpstashResponse } from "./http.js";
3
3
  import { Pipeline } from "./pipeline.js";
4
4
  import type { CommandArgs } from "./types.js";
@@ -61,6 +61,14 @@ export declare class Redis {
61
61
  * @see https://redis.io/commands/json.forget
62
62
  */
63
63
  forget: (key: string, path?: string | undefined) => Promise<number>;
64
+ /**
65
+ * @see https://redis.io/commands/geoadd
66
+ */
67
+ geoadd: (args_0: string, args_1: import("./commands/geo_add.js").GeoAddCommandOptions | import("./commands/geo_add.js").GeoMember<unknown>, ...args_2: import("./commands/geo_add.js").GeoMember<unknown>[]) => Promise<number | null>;
68
+ /**
69
+ * @see https://redis.io/commands/geopos
70
+ */
71
+ geopos: (...args: CommandArgs<typeof GeoPosCommand>) => Promise<any>;
64
72
  /**
65
73
  * @see https://redis.io/commands/json.get
66
74
  */
@@ -562,6 +570,31 @@ export declare class Redis {
562
570
  * @see https://redis.io/commands/unlink
563
571
  */
564
572
  unlink: (...args: CommandArgs<typeof UnlinkCommand>) => Promise<number>;
573
+ /**
574
+ * @see https://redis.io/commands/xadd
575
+ */
576
+ xadd: (key: string, id: string, entries: {
577
+ [field: string]: unknown;
578
+ }, opts?: {
579
+ nomkStream?: boolean | undefined;
580
+ trim?: (({
581
+ type: "MAXLEN" | "maxlen";
582
+ threshold: number;
583
+ } | {
584
+ type: "MINID" | "minid";
585
+ threshold: string;
586
+ }) & ({
587
+ comparison: "~";
588
+ limit?: number | undefined;
589
+ } | {
590
+ comparison: "=";
591
+ limit?: undefined;
592
+ })) | undefined;
593
+ } | undefined) => Promise<string>;
594
+ /**
595
+ * @see https://redis.io/commands/xrange
596
+ */
597
+ xrange: (key: string, start: string, end: string, count?: number | undefined) => Promise<Record<string, Record<string, unknown>>>;
565
598
  /**
566
599
  * @see https://redis.io/commands/zadd
567
600
  */
@@ -652,6 +685,10 @@ export declare class Redis {
652
685
  * @see https://redis.io/commands/zscore
653
686
  */
654
687
  zscore: <TData>(key: string, member: TData) => Promise<number | null>;
688
+ /**
689
+ * @see https://redis.io/commands/zunion
690
+ */
691
+ zunion: (numKeys: number, keys: string[], opts?: import("./commands/zunion.js").ZUnionCommandOptions | undefined) => Promise<any>;
655
692
  /**
656
693
  * @see https://redis.io/commands/zunionstore
657
694
  */
@@ -1 +1 @@
1
- export declare const VERSION = "v0.0.0-ci.97cb5577-20231010";
1
+ export declare const VERSION = "v0.0.0-ci.9d88b94d-20231018";