diff --git a/java/client/src/main/java/glide/api/commands/HashBaseCommands.java b/java/client/src/main/java/glide/api/commands/HashBaseCommands.java index 58a9814559..e732833223 100644 --- a/java/client/src/main/java/glide/api/commands/HashBaseCommands.java +++ b/java/client/src/main/java/glide/api/commands/HashBaseCommands.java @@ -3,7 +3,9 @@ import glide.api.models.GlideString; import glide.api.models.commands.scan.HScanOptions; +import glide.api.models.commands.scan.HScanOptions.HScanOptionsBuilder; import glide.api.models.commands.scan.HScanOptionsBinary; +import glide.api.models.commands.scan.HScanOptionsBinary.HScanOptionsBinaryBuilder; import java.util.Map; import java.util.concurrent.CompletableFuture; @@ -695,8 +697,9 @@ public interface HashBaseCommands { * cursor for the next iteration of results. "0" will be the cursor * returned on the last iteration of the result. The second element is always an * Array of the subset of the hash held in key. The array in the - * second element is always a flattened series of String pairs, where the key is - * at even indices and the value is at odd indices. If options.noValues is set to true + * second element is a flattened series of String pairs, where the key is at even + * indices and the value is at odd indices. If {@link HScanOptionsBuilder#noValues} is set to + * true * , the second element will only contain the fields without the values. * @example *
{@code
@@ -732,8 +735,9 @@ public interface HashBaseCommands {
      *     cursor for the next iteration of results. "0" will be the cursor
      *      returned on the last iteration of the result. The second element is always an
      *     Array of the subset of the hash held in key. The array in the
-     *     second element is always a flattened series of String pairs, where the key is
-     *     at even indices and the value is at odd indices. If options.noValues is set to true
+     *     second element is a flattened series of String pairs, where the key is at even
+     *     indices and the value is at odd indices. If {@link HScanOptionsBinaryBuilder#noValues} is
+     *     set to true
      *     , the second element will only contain the fields without the values.
      * @example
      *     
{@code
diff --git a/java/client/src/main/java/glide/api/commands/SortedSetBaseCommands.java b/java/client/src/main/java/glide/api/commands/SortedSetBaseCommands.java
index 2238b2c627..814a41cc99 100644
--- a/java/client/src/main/java/glide/api/commands/SortedSetBaseCommands.java
+++ b/java/client/src/main/java/glide/api/commands/SortedSetBaseCommands.java
@@ -22,7 +22,9 @@
 import glide.api.models.commands.WeightAggregateOptions.WeightedKeys;
 import glide.api.models.commands.ZAddOptions;
 import glide.api.models.commands.scan.ZScanOptions;
+import glide.api.models.commands.scan.ZScanOptions.ZScanOptionsBuilder;
 import glide.api.models.commands.scan.ZScanOptionsBinary;
+import glide.api.models.commands.scan.ZScanOptionsBinary.ZScanOptionsBinaryBuilder;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 
@@ -2789,8 +2791,9 @@ CompletableFuture> zinterWithScores(
      *      returned on the last iteration of the sorted set. The second element is always an
      *     
      *     Array of the subset of the sorted set held in key. The array in the
-     *     second element is always a flattened series of String pairs, where the value
-     *     is at even indices and the score is at odd indices. If options.noScores is to true
+     *     second element is a flattened series of String pairs, where the value is at
+     *     even indices and the score is at odd indices. If {@link ZScanOptionsBuilder#noScores} is to
+     *     true
      *     , the second element will only contain the members without scores.
      * @example
      *     
{@code
@@ -2827,8 +2830,9 @@ CompletableFuture> zinterWithScores(
      *      returned on the last iteration of the sorted set. The second element is always an
      *     
      *     Array of the subset of the sorted set held in key. The array in the
-     *     second element is always a flattened series of String pairs, where the value
-     *     is at even indices and the score is at odd indices. If options.noScores is to true
+     *     second element is a flattened series of String pairs, where the value is at
+     *     even indices and the score is at odd indices. If {@link ZScanOptionsBinaryBuilder#noScores}
+     *     is to true
      *     , the second element will only contain the members without scores.
      * @example
      *     
{@code
diff --git a/java/client/src/main/java/glide/api/models/BaseTransaction.java b/java/client/src/main/java/glide/api/models/BaseTransaction.java
index 6ccab2c274..ecbb9fac70 100644
--- a/java/client/src/main/java/glide/api/models/BaseTransaction.java
+++ b/java/client/src/main/java/glide/api/models/BaseTransaction.java
@@ -282,8 +282,10 @@
 import glide.api.models.commands.geospatial.GeoUnit;
 import glide.api.models.commands.geospatial.GeospatialData;
 import glide.api.models.commands.scan.HScanOptions;
+import glide.api.models.commands.scan.HScanOptions.HScanOptionsBuilder;
 import glide.api.models.commands.scan.SScanOptions;
 import glide.api.models.commands.scan.ZScanOptions;
+import glide.api.models.commands.scan.ZScanOptions.ZScanOptionsBuilder;
 import glide.api.models.commands.stream.StreamAddOptions;
 import glide.api.models.commands.stream.StreamAddOptions.StreamAddOptionsBuilder;
 import glide.api.models.commands.stream.StreamClaimOptions;
@@ -7054,10 +7056,10 @@ public  T zscan(@NonNull ArgType key, @NonNull ArgType cursor) {
      *     always the cursor for the next iteration of results. "0" will be
      *     the cursor returned on the last iteration of the sorted set. The second
      *     element is always an Array of the subset of the sorted set held in key
-     *     . The array in the second element is always a flattened series of String
+     *     . The array in the second element is a flattened series of String
      *      pairs, where the value is at even indices and the score is at odd indices. If
-     *     options.noScores is to true, the second element will only contain the members
-     *     without scores.
+     *     {@link ZScanOptionsBuilder#noScores} is to true, the second element will only
+     *     contain the members without scores.
      */
     public  T zscan(
             @NonNull ArgType key, @NonNull ArgType cursor, @NonNull ZScanOptions zScanOptions) {
@@ -7103,9 +7105,10 @@ public  T hscan(@NonNull ArgType key, @NonNull ArgType cursor) {
      *     always the cursor for the next iteration of results. "0" will be
      *     the cursor returned on the last iteration of the result. The second element is
      *     always an Array of the subset of the hash held in key. The array
-     *     in the second element is always a flattened series of String pairs, where the
-     *     key is at even indices and the value is at odd indices. If options.noValues is set to
-     *     true, the second element will only contain the fields without the values.
+     *     in the second element is a flattened series of String pairs, where the key is
+     *     at even indices and the value is at odd indices. If {@link HScanOptionsBuilder#noValues} is
+     *     set to true, the second element will only contain the fields without the
+     *     values.
      */
     public  T hscan(
             @NonNull ArgType key, @NonNull ArgType cursor, @NonNull HScanOptions hScanOptions) {
diff --git a/java/client/src/main/java/glide/api/models/commands/scan/HScanOptions.java b/java/client/src/main/java/glide/api/models/commands/scan/HScanOptions.java
index 38ac80136a..d96a2f13b4 100644
--- a/java/client/src/main/java/glide/api/models/commands/scan/HScanOptions.java
+++ b/java/client/src/main/java/glide/api/models/commands/scan/HScanOptions.java
@@ -3,10 +3,11 @@
 
 import glide.api.commands.HashBaseCommands;
 import glide.api.models.GlideString;
+import glide.api.models.commands.scan.BaseScanOptions.BaseScanOptionsBuilder;
 import glide.utils.ArgsBuilder;
 import java.util.Arrays;
-import java.util.Objects;
 import lombok.Builder;
+import lombok.EqualsAndHashCode;
 import lombok.experimental.SuperBuilder;
 
 /**
@@ -15,6 +16,7 @@
  * @see valkey.io
  */
 @SuperBuilder
+@EqualsAndHashCode(callSuper = false)
 public class HScanOptions extends BaseScanOptions {
 
     /** Option string to include in the HSCAN command when values are not included. */
@@ -22,7 +24,7 @@ public class HScanOptions extends BaseScanOptions {
 
     /**
      * When set to true, the command will not include values in the results. This option is available
-     * from Redis version 8.0.0 and above.
+     * from Valkey version 8.0.0 and above.
      */
     @Builder.Default protected boolean noValues = false;
 
@@ -54,12 +56,16 @@ public GlideString[] toGlideStringArgs() {
         return builder.toArray();
     }
 
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof HScanOptions)) return false;
-        if (!super.equals(o)) return false;
-        HScanOptions that = (HScanOptions) o;
-        return Objects.equals(noValues, that.noValues);
+    public abstract static class HScanOptionsBuilder<
+                    C extends HScanOptions, B extends HScanOptionsBuilder>
+            extends BaseScanOptionsBuilder {
+
+        protected boolean noValues = false;
+
+        /** Option string to include in the HSCAN command when values are not included. */
+        public B noValues() {
+            this.noValues = true;
+            return self();
+        }
     }
 }
diff --git a/java/client/src/main/java/glide/api/models/commands/scan/HScanOptionsBinary.java b/java/client/src/main/java/glide/api/models/commands/scan/HScanOptionsBinary.java
index 5bd9b4b7d2..9a38bd0517 100644
--- a/java/client/src/main/java/glide/api/models/commands/scan/HScanOptionsBinary.java
+++ b/java/client/src/main/java/glide/api/models/commands/scan/HScanOptionsBinary.java
@@ -5,9 +5,9 @@
 
 import glide.api.commands.HashBaseCommands;
 import glide.api.models.GlideString;
+import glide.api.models.commands.scan.BaseScanOptionsBinary.BaseScanOptionsBinaryBuilder;
 import glide.utils.ArgsBuilder;
 import java.util.Arrays;
-import java.util.Objects;
 import lombok.Builder;
 import lombok.experimental.SuperBuilder;
 
@@ -24,7 +24,7 @@ public class HScanOptionsBinary extends BaseScanOptionsBinary {
 
     /**
      * When set to true, the command will not include values in the results. This option is available
-     * from Redis version 8.0.0 and above.
+     * from Valkey version 8.0.0 and above.
      */
     @Builder.Default protected boolean noValues = false;
 
@@ -51,12 +51,16 @@ public String[] toArgs() {
         return Arrays.stream(builder.toArray()).map(GlideString::getString).toArray(String[]::new);
     }
 
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof ZScanOptionsBinary)) return false;
-        if (!super.equals(o)) return false;
-        HScanOptionsBinary that = (HScanOptionsBinary) o;
-        return Objects.equals(noValues, that.noValues);
+    public abstract static class HScanOptionsBinaryBuilder<
+                    C extends HScanOptionsBinary, B extends HScanOptionsBinaryBuilder>
+            extends BaseScanOptionsBinaryBuilder {
+
+        protected boolean noValues = false;
+
+        /** Option string to include in the HSCAN command when values are not included. */
+        public B noValues() {
+            this.noValues = true;
+            return self();
+        }
     }
 }
diff --git a/java/client/src/main/java/glide/api/models/commands/scan/ZScanOptions.java b/java/client/src/main/java/glide/api/models/commands/scan/ZScanOptions.java
index e50838808f..9e3f4113dd 100644
--- a/java/client/src/main/java/glide/api/models/commands/scan/ZScanOptions.java
+++ b/java/client/src/main/java/glide/api/models/commands/scan/ZScanOptions.java
@@ -3,10 +3,11 @@
 
 import glide.api.commands.SortedSetBaseCommands;
 import glide.api.models.GlideString;
+import glide.api.models.commands.scan.BaseScanOptions.BaseScanOptionsBuilder;
 import glide.utils.ArgsBuilder;
 import java.util.Arrays;
-import java.util.Objects;
 import lombok.Builder;
+import lombok.EqualsAndHashCode;
 import lombok.experimental.SuperBuilder;
 
 /**
@@ -15,6 +16,7 @@
  * @see valkey.io
  */
 @SuperBuilder
+@EqualsAndHashCode(callSuper = false)
 public class ZScanOptions extends BaseScanOptions {
 
     /** Option string to include in the ZSCAN command when scores are not included. */
@@ -22,7 +24,7 @@ public class ZScanOptions extends BaseScanOptions {
 
     /**
      * When set to true, the command will not include scores in the results. This option is available
-     * from Redis version 8.0.0 and above.
+     * from Valkey version 8.0.0 and above.
      */
     @Builder.Default protected boolean noScores = false;
 
@@ -54,12 +56,15 @@ public GlideString[] toGlideStringArgs() {
         return builder.toArray();
     }
 
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof ZScanOptions)) return false;
-        if (!super.equals(o)) return false;
-        ZScanOptions that = (ZScanOptions) o;
-        return Objects.equals(noScores, that.noScores);
+    public abstract static class ZScanOptionsBuilder<
+                    C extends ZScanOptions, B extends ZScanOptionsBuilder>
+            extends BaseScanOptionsBuilder {
+        protected boolean noScores = false;
+
+        /** Option string to include in the ZSCAN command when scores are not included. */
+        public B noScores() {
+            this.noScores = true;
+            return self();
+        }
     }
 }
diff --git a/java/client/src/main/java/glide/api/models/commands/scan/ZScanOptionsBinary.java b/java/client/src/main/java/glide/api/models/commands/scan/ZScanOptionsBinary.java
index 75020bc375..e9fd654710 100644
--- a/java/client/src/main/java/glide/api/models/commands/scan/ZScanOptionsBinary.java
+++ b/java/client/src/main/java/glide/api/models/commands/scan/ZScanOptionsBinary.java
@@ -5,10 +5,11 @@
 
 import glide.api.commands.SortedSetBaseCommands;
 import glide.api.models.GlideString;
+import glide.api.models.commands.scan.BaseScanOptionsBinary.BaseScanOptionsBinaryBuilder;
 import glide.utils.ArgsBuilder;
 import java.util.Arrays;
-import java.util.Objects;
 import lombok.Builder;
+import lombok.EqualsAndHashCode;
 import lombok.experimental.SuperBuilder;
 
 /**
@@ -18,6 +19,7 @@
  * @see valkey.io
  */
 @SuperBuilder
+@EqualsAndHashCode(callSuper = false)
 public class ZScanOptionsBinary extends BaseScanOptionsBinary {
     /** Option string to include in the ZSCAN command when scores are not included. */
     public static final GlideString NO_SCORES_API = gs("NOSCORES");
@@ -51,12 +53,15 @@ public String[] toArgs() {
         return Arrays.stream(builder.toArray()).map(GlideString::getString).toArray(String[]::new);
     }
 
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof ZScanOptionsBinary)) return false;
-        if (!super.equals(o)) return false;
-        ZScanOptionsBinary that = (ZScanOptionsBinary) o;
-        return Objects.equals(noScores, that.noScores);
+    public abstract static class ZScanOptionsBinaryBuilder<
+                    C extends ZScanOptionsBinary, B extends ZScanOptionsBinaryBuilder>
+            extends BaseScanOptionsBinaryBuilder {
+        protected boolean noScores = false;
+
+        /** Option string to include in the ZSCAN command when scores are not included. */
+        public B noScores() {
+            this.noScores = true;
+            return self();
+        }
     }
 }
diff --git a/java/integTest/src/test/java/glide/SharedCommandTests.java b/java/integTest/src/test/java/glide/SharedCommandTests.java
index 06be6cea3c..aadfc3cec8 100644
--- a/java/integTest/src/test/java/glide/SharedCommandTests.java
+++ b/java/integTest/src/test/java/glide/SharedCommandTests.java
@@ -14195,8 +14195,7 @@ public void zscan(BaseClient client) {
         assertTrue(ArrayUtils.getLength(result[resultCollectionIndex]) >= 0);
 
         if (SERVER_VERSION.isGreaterThanOrEqualTo("7.9.0")) {
-            result =
-                    client.zscan(key1, initialCursor, ZScanOptions.builder().noScores(true).build()).get();
+            result = client.zscan(key1, initialCursor, ZScanOptions.builder().noScores().build()).get();
             assertTrue(Long.parseLong(result[resultCursorIndex].toString()) >= 0);
             // Cast the result collection to a String array
             Object[] fieldsArray = (Object[]) result[resultCollectionIndex];
@@ -14403,9 +14402,7 @@ public void zscan_binary(BaseClient client) {
 
         if (SERVER_VERSION.isGreaterThanOrEqualTo("7.9.0")) {
             result =
-                    client
-                            .zscan(key1, initialCursor, ZScanOptionsBinary.builder().noScores(true).build())
-                            .get();
+                    client.zscan(key1, initialCursor, ZScanOptionsBinary.builder().noScores().build()).get();
             assertTrue(Long.parseLong(result[resultCursorIndex].toString()) >= 0);
             // Cast the result collection to a String array
             Object[] fieldsArray = (Object[]) result[resultCollectionIndex];
@@ -14589,8 +14586,7 @@ public void hscan(BaseClient client) {
         assertTrue(ArrayUtils.getLength(result[resultCollectionIndex]) >= 0);
 
         if (SERVER_VERSION.isGreaterThanOrEqualTo("7.9.0")) {
-            result =
-                    client.hscan(key1, initialCursor, HScanOptions.builder().noValues(true).build()).get();
+            result = client.hscan(key1, initialCursor, HScanOptions.builder().noValues().build()).get();
             assertTrue(Long.parseLong(result[resultCursorIndex].toString()) >= 0);
             // Cast the result collection to a String array
             Object[] fieldsArray = (Object[]) result[resultCollectionIndex];
@@ -14779,9 +14775,7 @@ public void hscan_binary(BaseClient client) {
 
         if (SERVER_VERSION.isGreaterThanOrEqualTo("7.9.0")) {
             result =
-                    client
-                            .hscan(key1, initialCursor, HScanOptionsBinary.builder().noValues(true).build())
-                            .get();
+                    client.hscan(key1, initialCursor, HScanOptionsBinary.builder().noValues().build()).get();
             assertTrue(Long.parseLong(result[resultCursorIndex].toString()) >= 0);
             // Cast the result collection to a String array
             Object[] fieldsArray = (Object[]) result[resultCollectionIndex];
diff --git a/java/integTest/src/test/java/glide/TransactionTestUtilities.java b/java/integTest/src/test/java/glide/TransactionTestUtilities.java
index 4e41fb2751..077a70ee10 100644
--- a/java/integTest/src/test/java/glide/TransactionTestUtilities.java
+++ b/java/integTest/src/test/java/glide/TransactionTestUtilities.java
@@ -383,9 +383,7 @@ private static Object[] hashCommands(BaseTransaction transaction) {
                 .hscan(hashKey2, "0", HScanOptions.builder().count(20L).build());
 
         if (SERVER_VERSION.isGreaterThanOrEqualTo("7.9.0")) {
-            transaction
-                    .hscan(hashKey2, "0", HScanOptions.builder().count(20L).noValues(false).build())
-                    .hscan(hashKey2, "0", HScanOptions.builder().count(20L).noValues(true).build());
+            transaction.hscan(hashKey2, "0", HScanOptions.builder().count(20L).noValues().build());
         }
 
         var result =
@@ -422,10 +420,8 @@ private static Object[] hashCommands(BaseTransaction transaction) {
                     concatenateArrays(
                             result,
                             new Object[] {
-                                new Object[] {"0", new Object[] {field1, value1}}, // hscan(hashKey2, "0",
-                                // HScanOptions.builder().count(20L).noValues(false).build());
                                 new Object[] {"0", new Object[] {field1}}, // hscan(hashKey2, "0",
-                                // HScanOptions.builder().count(20L).noValues(true).build());
+                                // HScanOptions.builder().count(20L).noValues().build());
                             });
         }
 
@@ -671,9 +667,7 @@ private static Object[] sortedSetCommands(BaseTransaction transaction) {
                 .zscan(zSetKey2, "0")
                 .zscan(zSetKey2, "0", ZScanOptions.builder().count(20L).build());
         if (SERVER_VERSION.isGreaterThanOrEqualTo("7.9.0")) {
-            transaction
-                    .zscan(zSetKey2, 0, ZScanOptions.builder().count(20L).noScores(false).build())
-                    .zscan(zSetKey2, 0, ZScanOptions.builder().count(20L).noScores(true).build());
+            transaction.zscan(zSetKey2, 0, ZScanOptions.builder().count(20L).noScores().build());
         }
 
         transaction.bzpopmin(new String[] {zSetKey2}, .1);
@@ -746,12 +740,9 @@ private static Object[] sortedSetCommands(BaseTransaction transaction) {
                     concatenateArrays(
                             expectedResults,
                             new Object[] {
-                                new Object[] {
-                                    "0", new String[] {"one", "1"}
-                                }, // zscan(zSetKey2, 0, ZScanOptions.builder().count(20L).noScores(false).build())
                                 new Object[] {
                                     "0", new String[] {"one"}
-                                }, // zscan(zSetKey2, 0, ZScanOptions.builder().count(20L).noScores(true).build())
+                                }, // zscan(zSetKey2, 0, ZScanOptions.builder().count(20L).noScores().build())
                             });
         }
 
diff --git a/node/npm/glide/index.ts b/node/npm/glide/index.ts
index 65840cf7a8..70458dfc8f 100644
--- a/node/npm/glide/index.ts
+++ b/node/npm/glide/index.ts
@@ -77,6 +77,8 @@ function initialize() {
     const {
         AggregationType,
         BaseScanOptions,
+        ZScanOptions,
+        HScanOptions,
         BitEncoding,
         BitFieldGet,
         BitFieldIncrBy,
@@ -185,6 +187,8 @@ function initialize() {
     module.exports = {
         AggregationType,
         BaseScanOptions,
+        HScanOptions,
+        ZScanOptions,
         BitEncoding,
         BitFieldGet,
         BitFieldIncrBy,
diff --git a/node/src/BaseClient.ts b/node/src/BaseClient.ts
index 019d2db556..8b394586a4 100644
--- a/node/src/BaseClient.ts
+++ b/node/src/BaseClient.ts
@@ -56,6 +56,7 @@ import {
     StreamTrimOptions,
     TimeUnit,
     ZAddOptions,
+    ZScanOptions,
     convertElementsAndScores,
     createAppend,
     createBLMPop,
@@ -2054,9 +2055,9 @@ export class BaseClient {
      * @returns An array of the `cursor` and the subset of the hash held by `key`.
      * The first element is always the `cursor` for the next iteration of results. `"0"` will be the `cursor`
      * returned on the last iteration of the hash. The second element is always an array of the subset of the
-     * hash held in `key`. The array in the second element is always a flattened series of string pairs,
+     * hash held in `key`. The array in the second element is a flattened series of string pairs,
      * where the value is at even indices and the value is at odd indices.
-     * If options.noValues is set to `true`, the second element will only contain the fields without the values.
+     * If `options.noValues` is set to `true`, the second element will only contain the fields without the values.
      *
      * @example
      * ```typescript
@@ -6471,21 +6472,18 @@ export class BaseClient {
      * @returns An `Array` of the `cursor` and the subset of the sorted set held by `key`.
      *      The first element is always the `cursor` for the next iteration of results. `0` will be the `cursor`
      *      returned on the last iteration of the sorted set. The second element is always an `Array` of the subset
-     *      of the sorted set held in `key`. The `Array` in the second element is always a flattened series of
+     *      of the sorted set held in `key`. The `Array` in the second element is a flattened series of
      *      `string` pairs, where the value is at even indices and the score is at odd indices.
-     *      If options.noScores is to `true`, the second element will only contain the members without scores.
+     *      If `options.noScores` is to `true`, the second element will only contain the members without scores.
      *
      * @example
      * ```typescript
-     * // Assume "key" contains a sorted set with multiple members
-     * let newCursor = "0";
-     * let result = [];
-     *
+     * // Assume "key1" contains a sorted set with multiple members
+     * let cursor = "0";
      * do {
      *      const result = await client.zscan(key1, cursor, {
      *          match: "*",
      *          count: 5,
-     *          noScores: true,
      *      });
      *      cursor = result[0];
      *      console.log("Cursor: ", cursor);
@@ -6493,11 +6491,36 @@ export class BaseClient {
      * } while (cursor !== "0");
      * // The output of the code above is something similar to:
      * // Cursor:  123
+     * // Members:  ['value 163', '163', 'value 114', '114', 'value 25', '25', 'value 82', '82', 'value 64', '64']
+     * // Cursor:  47
+     * // Members:  ['value 39', '39', 'value 127', '127', 'value 43', '43', 'value 139', '139', 'value 211', '211']
+     * // Cursor:  0
+     * // Members:  ['value 55', '55', 'value 24', '24', 'value 90', '90', 'value 113', '113']
+     * ```
+     *
+     * @example
+     * ```typescript
+     * // Zscan with no scores
+     * let newCursor = "0";
+     * let result = [];
+     *
+     * do {
+     *      result = await client.zscan(key1, newCursor, {
+     *          match: "*",
+     *          count: 5,
+     *          noScores: true,
+     *      });
+     *      newCursor = result[0];
+     *      console.log("Cursor: ", newCursor);
+     *      console.log("Members: ", result[1]);
+     * } while (newCursor !== "0");
+     * // The output of the code above is something similar to:
+     * // Cursor:  123
      * // Members:  ['value 163', 'value 114', 'value 25', 'value 82', 'value 64']
      * // Cursor:  47
      * // Members:  ['value 39', 'value 127', 'value 43', 'value 139', 'value 211']
      * // Cursor:  0
-     * // Members:  ['value 55', '55', 'value 24', '24', 'value 90', '90', 'value 113', '113']
+     * // Members:  ['value 55', 'value 24' 'value 90', 'value 113']
      * ```
      */
     public async zscan(
diff --git a/node/src/Transaction.ts b/node/src/Transaction.ts
index 2f02f65b71..87d86f8db3 100644
--- a/node/src/Transaction.ts
+++ b/node/src/Transaction.ts
@@ -68,6 +68,7 @@ import {
     StreamTrimOptions,
     TimeUnit,
     ZAddOptions,
+    ZScanOptions,
     convertElementsAndScores,
     createAppend,
     createBLMPop,
@@ -1002,9 +1003,9 @@ export class BaseTransaction> {
      * Command Response - An array of the `cursor` and the subset of the hash held by `key`.
      * The first element is always the `cursor` for the next iteration of results. `"0"` will be the `cursor`
      * returned on the last iteration of the hash. The second element is always an array of the subset of the
-     * hash held in `key`. The array in the second element is always a flattened series of string pairs,
+     * hash held in `key`. The array in the second element is a flattened series of string pairs,
      * where the value is at even indices and the value is at odd indices.
-     * If options.noValues is set to `true`, the second element will only contain the fields without the values.
+     * If `options.noValues` is set to `true`, the second element will only contain the fields without the values.
      */
     public hscan(key: string, cursor: string, options?: HScanOptions): T {
         return this.addAndReturn(createHScan(key, cursor, options));
@@ -3682,9 +3683,9 @@ export class BaseTransaction> {
      * Command Response - An `Array` of the `cursor` and the subset of the sorted set held by `key`.
      *      The first element is always the `cursor` for the next iteration of results. `0` will be the `cursor`
      *      returned on the last iteration of the sorted set. The second element is always an `Array` of the subset
-     *      of the sorted set held in `key`. The `Array` in the second element is always a flattened series of
+     *      of the sorted set held in `key`. The `Array` in the second element is a flattened series of
      *      `String` pairs, where the value is at even indices and the score is at odd indices.
-     *      If options.noScores is to `true`, the second element will only contain the members without scores.
+     *      If `options.noScores` is to `true`, the second element will only contain the members without scores.
      */
     public zscan(key: GlideString, cursor: string, options?: ZScanOptions): T {
         return this.addAndReturn(createZScan(key, cursor, options));
diff --git a/python/python/glide/async_commands/core.py b/python/python/glide/async_commands/core.py
index 87c2c9b593..ba8fd51f74 100644
--- a/python/python/glide/async_commands/core.py
+++ b/python/python/glide/async_commands/core.py
@@ -6142,7 +6142,7 @@ async def zscan(
             List[Union[bytes, List[bytes]]]: An `Array` of the `cursor` and the subset of the sorted set held by `key`.
             The first element is always the `cursor` for the next iteration of results. `0` will be the `cursor`
             returned on the last iteration of the sorted set. The second element is always an `Array` of the subset
-            of the sorted set held in `key`. The `Array` in the second element is always a flattened series of
+            of the sorted set held in `key`. The `Array` in the second element is a flattened series of
             `String` pairs, where the value is at even indices and the score is at odd indices.
             If `no_scores` is set to`True`, the second element will only contain the members without scores.
 
@@ -6225,7 +6225,7 @@ async def hscan(
             List[Union[bytes, List[bytes]]]: An `Array` of the `cursor` and the subset of the hash held by `key`.
                 The first element is always the `cursor` for the next iteration of results. `0` will be the `cursor`
                 returned on the last iteration of the hash. The second element is always an `Array` of the subset of the
-                hash held in `key`. The `Array` in the second element is always a flattened series of `String` pairs,
+                hash held in `key`. The `Array` in the second element is a flattened series of `String` pairs,
                 where the value is at even indices and the score is at odd indices.
                 If `no_values` is set to `True`, the second element will only contain the fields without the values.
 
diff --git a/python/python/glide/async_commands/transaction.py b/python/python/glide/async_commands/transaction.py
index 3906c17126..8201c482bc 100644
--- a/python/python/glide/async_commands/transaction.py
+++ b/python/python/glide/async_commands/transaction.py
@@ -4488,7 +4488,7 @@ def zscan(
             List[Union[bytes, List[bytes]]]: An `Array` of the `cursor` and the subset of the sorted set held by `key`.
             The first element is always the `cursor` for the next iteration of results. `0` will be the `cursor`
             returned on the last iteration of the sorted set. The second element is always an `Array` of the subset
-            of the sorted set held in `key`. The `Array` in the second element is always a flattened series of
+            of the sorted set held in `key`. The `Array` in the second element is a flattened series of
             `String` pairs, where the value is at even indices and the score is at odd indices.
             If `no_scores` is set to`True`, the second element will only contain the members without scores.
         """
@@ -4533,7 +4533,7 @@ def hscan(
             List[Union[bytes, List[bytes]]]: An `Array` of the `cursor` and the subset of the hash held by `key`.
                 The first element is always the `cursor` for the next iteration of results. `0` will be the `cursor`
                 returned on the last iteration of the hash. The second element is always an `Array` of the subset of the
-                hash held in `key`. The `Array` in the second element is always a flattened series of `String` pairs,
+                hash held in `key`. The `Array` in the second element is a flattened series of `String` pairs,
                 where the value is at even indices and the score is at odd indices.
                 If `no_values` is set to `True`, the second element will only contain the fields without the values.
         """