diff --git a/bin/overrides.js b/bin/overrides.js index 96a8606ff..ee4ca5f54 100644 --- a/bin/overrides.js +++ b/bin/overrides.js @@ -2,6 +2,7 @@ const msetOverrides = { overwrite: false, defs: [ "$1(object: object, callback?: Callback<'OK'>): Result<'OK', Context>", + "$1(map: Map, callback?: Callback<'OK'>): Result<'OK', Context>", ], }; @@ -19,12 +20,14 @@ module.exports = { overwrite: false, defs: [ "$1(key: RedisKey, object: object, callback?: Callback): Result", + "$1(key: RedisKey, map: Map, callback?: Callback<'OK'>): Result<'OK', Context>", ], }, hmset: { overwrite: false, defs: [ "$1(key: RedisKey, object: object, callback?: Callback<'OK'>): Result<'OK', Context>", + "$1(key: RedisKey, map: Map, callback?: Callback<'OK'>): Result<'OK', Context>", ], }, exec: { diff --git a/lib/utils/RedisCommander.ts b/lib/utils/RedisCommander.ts index 8d26741c3..ef9fa3030 100644 --- a/lib/utils/RedisCommander.ts +++ b/lib/utils/RedisCommander.ts @@ -4283,6 +4283,11 @@ interface RedisCommander { object: object, callback?: Callback<"OK"> ): Result<"OK", Context>; + hmset( + key: RedisKey, + map: Map, + callback?: Callback<"OK"> + ): Result<"OK", Context>; hmset( ...args: [ key: RedisKey, @@ -4405,6 +4410,11 @@ interface RedisCommander { object: object, callback?: Callback ): Result; + hset( + key: RedisKey, + map: Map, + callback?: Callback<"OK"> + ): Result<"OK", Context>; hset( ...args: [ key: RedisKey, @@ -5504,6 +5514,10 @@ interface RedisCommander { * - _since_: 1.0.1 */ mset(object: object, callback?: Callback<"OK">): Result<"OK", Context>; + mset( + map: Map, + callback?: Callback<"OK"> + ): Result<"OK", Context>; mset( ...args: [ ...keyValues: (RedisKey | string | Buffer | number)[], @@ -5521,6 +5535,10 @@ interface RedisCommander { * - _since_: 1.0.1 */ msetnx(object: object, callback?: Callback<"OK">): Result<"OK", Context>; + msetnx( + map: Map, + callback?: Callback<"OK"> + ): Result<"OK", Context>; msetnx( ...args: [ ...keyValues: (RedisKey | string | Buffer | number)[], diff --git a/test/functional/transformer.ts b/test/functional/transformer.ts index d54b8da5e..5685f75a4 100644 --- a/test/functional/transformer.ts +++ b/test/functional/transformer.ts @@ -11,13 +11,20 @@ describe("transformer", () => { expect(await redis.hget("foo", "b")).to.eql("2"); }); - it("should support Map", async () => { + it("should support Map with string keys", async () => { const redis = new Redis(); const map = new Map(); map.set("a", 1); map.set("b", "2"); + map.set(42, true); + map.set(Buffer.from("buffer"), "utf8"); + map.set(Buffer.from([0xff]), "binary"); expect(await redis.hmset("foo", map)).to.eql("OK"); + expect(await redis.hget("foo", "a")).to.eql("1"); expect(await redis.hget("foo", "b")).to.eql("2"); + expect(await redis.hget("foo", "42")).to.eql("true"); + expect(await redis.hget("foo", "buffer")).to.eql("utf8"); + expect(await redis.hget("foo", Buffer.from([0xff]))).to.eql("binary"); }); it("should not affect the old way", async () => { diff --git a/test/typing/transformers.test-d.ts b/test/typing/transformers.test-d.ts index ab80580af..a65b4ac0e 100644 --- a/test/typing/transformers.test-d.ts +++ b/test/typing/transformers.test-d.ts @@ -7,25 +7,45 @@ interface User { } const user: User = { name: "Bob", title: "Engineer" }; -const map = new Map([["key", "value"]]); +const stringMap = new Map([["key", "value"]]); +const numberMap = new Map([[42, "value"]]); +const bufferMap = new Map([[Buffer.from([0xff]), "value"]]); +const mixedMap = new Map([ + [Buffer.from([0xff]), "value"], + [42, "value"], + ["field", "value"], +]); const redis = new Redis(); // mset +expectType>(redis.mset("key1", "value1", "key2", "value2")); expectType>(redis.mset(user)); -expectType>(redis.mset(map)); +expectType>(redis.mset(stringMap)); +expectType>(redis.mset(numberMap)); +expectType>(redis.mset(bufferMap)); +expectType>(redis.mset(mixedMap)); // msetnx expectType>(redis.msetnx(user)); -expectType>(redis.msetnx(map)); +expectType>(redis.msetnx(stringMap)); +expectType>(redis.msetnx(numberMap)); +expectType>(redis.msetnx(bufferMap)); +expectType>(redis.msetnx(mixedMap)); // hmset expectType>(redis.hmset("key", user)); -expectType>(redis.hmset("key", map)); +expectType>(redis.hmset("key", stringMap)); +expectType>(redis.hmset("key", numberMap)); +expectType>(redis.hmset("key", bufferMap)); +expectType>(redis.hmset("key", mixedMap)); // hset expectType>(redis.hset("key", user)); -expectType>(redis.hset("key", map)); +expectType>(redis.hset("key", stringMap)); +expectType>(redis.hset("key", numberMap)); +expectType>(redis.hset("key", bufferMap)); +expectType>(redis.hset("key", mixedMap)); // hgetall expectType>>(redis.hgetall("key"));