diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 0ce929fbc5..a0c8223d66 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -17,7 +17,7 @@ jobs: fail-fast: false matrix: node-version: ['12', '14', '16'] - redis-version: ['5', '6.0', '6.2'] + redis-version: ['5', '6.0', '6.2', '7.0-rc2'] steps: - uses: actions/checkout@v2.3.4 with: diff --git a/package-lock.json b/package-lock.json index 3072740667..090ee91218 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,29 +1,41 @@ { "name": "redis", - "version": "4.0.4", + "version": "4.0.6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "redis", - "version": "4.0.4", + "version": "4.0.6", "license": "MIT", "workspaces": [ "./packages/*" ], "dependencies": { "@node-redis/bloom": "1.0.1", - "@node-redis/client": "1.0.4", + "@node-redis/client": "1.0.5", "@node-redis/graph": "1.0.0", "@node-redis/json": "1.0.2", - "@node-redis/search": "1.0.3", + "@node-redis/search": "1.0.5", "@node-redis/time-series": "1.0.2" }, "devDependencies": { "@tsconfig/node12": "^1.0.9", "gh-pages": "^3.2.3", - "release-it": "^14.12.1", - "typescript": "^4.5.4" + "release-it": "^14.13.1", + "typescript": "^4.6.3" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", + "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.0" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { @@ -39,35 +51,35 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", - "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.16.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", - "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", + "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", "dev": true, "dependencies": { + "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.8", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.16.7", - "@babel/parser": "^7.16.12", + "@babel/generator": "^7.17.7", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.8", + "@babel/parser": "^7.17.8", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.10", - "@babel/types": "^7.16.8", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -78,12 +90,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", - "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", + "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", "dev": true, "dependencies": { - "@babel/types": "^7.16.8", + "@babel/types": "^7.17.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -92,12 +104,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.16.4", + "@babel/compat-data": "^7.17.7", "@babel/helper-validator-option": "^7.16.7", "browserslist": "^4.17.5", "semver": "^6.3.0" @@ -172,31 +184,31 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", - "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" @@ -233,14 +245,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", - "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", + "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", "dev": true, "dependencies": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" }, "engines": { "node": ">=6.9.0" @@ -323,9 +335,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.16.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", + "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -349,19 +361,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", - "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.8", + "@babel/generator": "^7.17.3", "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-function-name": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.10", - "@babel/types": "^7.16.8", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -379,9 +391,9 @@ } }, "node_modules/@babel/types": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", - "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.16.7", @@ -413,16 +425,16 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", + "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.2.0", + "espree": "^9.3.1", "globals": "^13.9.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.0.4", @@ -432,15 +444,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -454,9 +457,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", - "integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==", + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -559,6 +562,31 @@ "node": ">=8" } }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", + "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@node-redis/bloom": { "resolved": "packages/bloom", "link": true @@ -632,14 +660,14 @@ } }, "node_modules/@octokit/core": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.5.1.tgz", - "integrity": "sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", + "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", "dev": true, "dependencies": { "@octokit/auth-token": "^2.4.4", "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.0", + "@octokit/request": "^5.6.3", "@octokit/request-error": "^2.0.5", "@octokit/types": "^6.0.3", "before-after-hook": "^2.2.0", @@ -755,9 +783,9 @@ } }, "node_modules/@sindresorhus/is": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.4.0.tgz", - "integrity": "sha512-QppPM/8l3Mawvh4rn9CNEYIU9bxpXUCRMaX9yUpvBk1nMKusLKpfXGDEKExKaPhLzcn3lzil7pR6rnJ11HgeRQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, "engines": { "node": ">=10" @@ -776,9 +804,9 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.1.tgz", + "integrity": "sha512-Wp5vwlZ0lOqpSYGKqr53INws9HLkt6JDc/pDZcPf7bchQnrXJMXPns8CXx0hFikMSGSWfvtvvpb2gtMVfkWagA==", "dev": true, "dependencies": { "@sinonjs/commons": "^1.7.0" @@ -856,15 +884,15 @@ "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "node_modules/@types/keyv": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", - "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dev": true, "dependencies": { "@types/node": "*" @@ -877,9 +905,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "17.0.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.13.tgz", - "integrity": "sha512-Y86MAxASe25hNzlDbsviXl8jQHb0RDvKt4c40ZJQ1Don0AAL0STLZSs4N+6gLEO55pedy7r2cLwS+ZDxPm/2Bw==", + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", "dev": true }, "node_modules/@types/parse-json": { @@ -914,14 +942,20 @@ } }, "node_modules/@types/sinon": { - "version": "10.0.9", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.9.tgz", - "integrity": "sha512-xGZVAe61omKnVGedBdTbAveuJ5QyI0LrMIcp0hc1LmVI5IEjs5qG4fM0sv9GIBA2JVoKuf7332IjQX4y5qqMMQ==", + "version": "10.0.11", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.11.tgz", + "integrity": "sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g==", "dev": true, "dependencies": { - "@sinonjs/fake-timers": "^7.1.0" + "@types/sinonjs__fake-timers": "*" } }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", + "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", + "dev": true + }, "node_modules/@types/yallist": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/yallist/-/yallist-4.0.1.tgz", @@ -929,29 +963,29 @@ "dev": true }, "node_modules/@types/yargs": { - "version": "17.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.8.tgz", - "integrity": "sha512-wDeUwiUmem9FzsyysEwRukaEdDNcwbROvQ9QGRKaLI6t+IltNzbn4/i4asmB10auvZGQCzSQ6t0GSczEThlUXw==", + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", + "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.1.tgz", - "integrity": "sha512-xN3CYqFlyE/qOcy978/L0xLR2HlcAGIyIK5sMOasxaaAPfQRj/MmMV6OC3I7NZO84oEUdWCOju34Z9W8E0pFDQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.17.0.tgz", + "integrity": "sha512-qVstvQilEd89HJk3qcbKt/zZrfBZ+9h2ynpAGlWjWiizA7m/MtLT9RoX6gjtpE500vfIg8jogAkDzdCxbsFASQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.10.1", - "@typescript-eslint/type-utils": "5.10.1", - "@typescript-eslint/utils": "5.10.1", + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/type-utils": "5.17.0", + "@typescript-eslint/utils": "5.17.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -992,14 +1026,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.1.tgz", - "integrity": "sha512-GReo3tjNBwR5RnRO0K2wDIDN31cM3MmDtgyQ85oAxAmC5K3j/g85IjP+cDfcqDsDDBf1HNKQAD0WqOYL8jXqUA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.17.0.tgz", + "integrity": "sha512-aRzW9Jg5Rlj2t2/crzhA2f23SIYFlF9mchGudyP0uiD6SenIxzKoLjwzHbafgHn39dNV/TV7xwQkLfFTZlJ4ig==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.10.1", - "@typescript-eslint/types": "5.10.1", - "@typescript-eslint/typescript-estree": "5.10.1", + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/typescript-estree": "5.17.0", "debug": "^4.3.2" }, "engines": { @@ -1019,13 +1053,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.1.tgz", - "integrity": "sha512-Lyvi559Gvpn94k7+ElXNMEnXu/iundV5uFmCUNnftbFrUbAJ1WBoaGgkbOBm07jVZa682oaBU37ao/NGGX4ZDg==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.17.0.tgz", + "integrity": "sha512-062iCYQF/doQ9T2WWfJohQKKN1zmmXVfAcS3xaiialiw8ZUGy05Em6QVNYJGO34/sU1a7a+90U3dUNfqUDHr3w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.10.1", - "@typescript-eslint/visitor-keys": "5.10.1" + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/visitor-keys": "5.17.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1036,12 +1070,12 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.1.tgz", - "integrity": "sha512-AfVJkV8uck/UIoDqhu+ptEdBoQATON9GXnhOpPLzkQRJcSChkvD//qsz9JVffl2goxX+ybs5klvacE9vmrQyCw==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.17.0.tgz", + "integrity": "sha512-3hU0RynUIlEuqMJA7dragb0/75gZmwNwFf/QJokWzPehTZousP/MNifVSgjxNcDCkM5HI2K22TjQWUmmHUINSg==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "5.10.1", + "@typescript-eslint/utils": "5.17.0", "debug": "^4.3.2", "tsutils": "^3.21.0" }, @@ -1062,9 +1096,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.1.tgz", - "integrity": "sha512-ZvxQ2QMy49bIIBpTqFiOenucqUyjTQ0WNLhBM6X1fh1NNlYAC6Kxsx8bRTY3jdYsYg44a0Z/uEgQkohbR0H87Q==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.17.0.tgz", + "integrity": "sha512-AgQ4rWzmCxOZLioFEjlzOI3Ch8giDWx8aUDxyNw9iOeCvD3GEYAB7dxWGQy4T/rPVe8iPmu73jPHuaSqcjKvxw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1075,13 +1109,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.1.tgz", - "integrity": "sha512-PwIGnH7jIueXv4opcwEbVGDATjGPO1dx9RkUl5LlHDSe+FXxPwFL5W/qYd5/NHr7f6lo/vvTrAzd0KlQtRusJQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.17.0.tgz", + "integrity": "sha512-X1gtjEcmM7Je+qJRhq7ZAAaNXYhTgqMkR10euC4Si6PIjb+kwEQHSxGazXUQXFyqfEXdkGf6JijUu5R0uceQzg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.10.1", - "@typescript-eslint/visitor-keys": "5.10.1", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/visitor-keys": "5.17.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -1146,15 +1180,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.1.tgz", - "integrity": "sha512-RRmlITiUbLuTRtn/gcPRi4202niF+q7ylFLCKu4c+O/PcpRvZ/nAUwQ2G00bZgpWkhrNLNnvhZLbDn8Ml0qsQw==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.17.0.tgz", + "integrity": "sha512-DVvndq1QoxQH+hFv+MUQHrrWZ7gQ5KcJzyjhzcqB1Y2Xes1UQQkTRPUfRpqhS8mhTWsSb2+iyvDW1Lef5DD7vA==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.10.1", - "@typescript-eslint/types": "5.10.1", - "@typescript-eslint/typescript-estree": "5.10.1", + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/typescript-estree": "5.17.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -1170,12 +1204,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.1.tgz", - "integrity": "sha512-NjQ0Xinhy9IL979tpoTRuLKxMc0zJC7QVSdeerXs2/QvOy2yRkzX5dRb10X5woNUdJgU8G3nYRDlI33sq1K4YQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.17.0.tgz", + "integrity": "sha512-6K/zlc4OfCagUu7Am/BD5k8PSWQOgh34Nrv9Rxe2tBzlJ7uOeJ/h7ugCGDCeEZHT6k2CJBhbk9IsbkPI0uvUkA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.10.1", + "@typescript-eslint/types": "5.17.0", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -1511,15 +1545,25 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], "dependencies": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", - "node-releases": "^2.0.1", + "node-releases": "^2.0.2", "picocolors": "^1.0.0" }, "bin": { @@ -1527,10 +1571,6 @@ }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" } }, "node_modules/buffer": { @@ -1655,14 +1695,20 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001304", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001304.tgz", - "integrity": "sha512-bdsfZd6K6ap87AGqSHJP/s1V+U6Z5lyrcbBu3ovbCCf8cSYpwTtGrCBObMpJqwxfTbLW6YTIdbb1jEeTelcpYQ==", + "version": "1.0.30001323", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001323.tgz", + "integrity": "sha512-e4BF2RlCVELKx8+RmklSEIVub1TWrmdhvA5kEUueummz1XyySW0DVk+3x9HyhU9MuWTa2BhqLgEuEmUwASAdCA==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] }, "node_modules/chalk": { "version": "4.1.2", @@ -2109,9 +2155,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.57", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.57.tgz", - "integrity": "sha512-FNC+P5K1n6pF+M0zIK+gFCoXcJhhzDViL3DRIGy2Fv5PohuSES1JHR7T+GlwxSxlzx4yYbsuzCZvHxcBSRCIOw==", + "version": "1.4.103", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", + "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==", "dev": true }, "node_modules/email-addresses": { @@ -2178,12 +2224,12 @@ } }, "node_modules/eslint": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz", - "integrity": "sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.12.0.tgz", + "integrity": "sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.0.5", + "@eslint/eslintrc": "^1.2.1", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -2191,10 +2237,10 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", + "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.2.0", - "espree": "^9.3.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2270,9 +2316,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", - "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2291,9 +2337,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -2337,14 +2383,14 @@ } }, "node_modules/espree": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", - "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", "dev": true, "dependencies": { "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" + "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2878,9 +2924,9 @@ } }, "node_modules/globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2982,9 +3028,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, "engines": { "node": ">= 0.4" @@ -3595,9 +3641,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz", - "integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -3662,13 +3708,10 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -3698,9 +3741,9 @@ "dev": true }, "node_modules/keyv": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.5.tgz", - "integrity": "sha512-531pkGLqV3BMg0eDqqJFI0R1mkK1Nm5xIP2mM6keP5P8WfFtCkg2IOwplTUmlGoTgIg9yQYZ/kdihhz89XH3vA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", + "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", "dev": true, "dependencies": { "json-buffer": "3.0.1" @@ -3877,13 +3920,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" @@ -3929,9 +3972,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -3941,15 +3984,15 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "node_modules/mocha": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.0.tgz", - "integrity": "sha512-kNn7E8g2SzVcq0a77dkphPsDSN7P+iYkqE0ZsGCYWRsoiKjOt+NvXfaagik8vuDa6W5Zw3qxe8Jfpt5qKf+6/Q==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", "dev": true, "dependencies": { "@ungap/promise-all-settled": "1.1.2", @@ -3965,9 +4008,9 @@ "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", - "minimatch": "3.0.4", + "minimatch": "4.2.1", "ms": "2.1.3", - "nanoid": "3.2.0", + "nanoid": "3.3.1", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", @@ -4032,6 +4075,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mocha/node_modules/minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -4135,9 +4190,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", - "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" @@ -4174,13 +4229,13 @@ } }, "node_modules/nise": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", - "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", + "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": ">=5", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", "path-to-regexp": "^1.7.0" @@ -4219,9 +4274,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", "dev": true }, "node_modules/normalize-path": { @@ -5179,9 +5234,9 @@ } }, "node_modules/release-it": { - "version": "14.12.4", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.12.4.tgz", - "integrity": "sha512-lqf9PMsj7ycCqFHGag8Uv7cE1hNsKa+yKUMe+Fkh9fdOfxu2F01On+YUefRCP0DuQthmr/WyLCYdrjThMEkWFQ==", + "version": "14.13.1", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.13.1.tgz", + "integrity": "sha512-mrng5bqZDFMr/7oCH3kuflwjKpKki4dUp6yYGxs20scYCvvd8rHAI5pdQOJHwI5BKHAC/pad0UjAEycMWQnEIw==", "dev": true, "dependencies": { "@iarna/toml": "2.2.5", @@ -5210,6 +5265,7 @@ "update-notifier": "5.1.0", "url-join": "4.0.1", "uuid": "8.3.2", + "wildcard-match": "5.1.2", "yaml": "1.10.2", "yargs-parser": "20.2.9" }, @@ -5412,9 +5468,9 @@ } }, "node_modules/rxjs": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.2.tgz", - "integrity": "sha512-PwDt186XaL3QN5qXj/H9DGyHhP3/RYYgZZwqBv9Tv8rsAaiwFH1IsJJlcgD37J7UW5a6O67qX0KWKS3/pu0m4w==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", "dev": true, "dependencies": { "tslib": "^2.1.0" @@ -5521,9 +5577,9 @@ } }, "node_modules/shiki": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.0.tgz", - "integrity": "sha512-iczxaIYeBFHTFrQPb9DVy2SKgYxC4Wo7Iucm7C17cCh2Ge/refnvHscUOxM85u57MfLoNOtjoEFUWt9gBexblA==", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.1.tgz", + "integrity": "sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==", "dev": true, "dependencies": { "jsonc-parser": "^3.0.0", @@ -5546,22 +5602,22 @@ } }, "node_modules/signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "node_modules/sinon": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.0.tgz", - "integrity": "sha512-3tjMDB/tY04b06Bnb4aMKQfNrau2C9HET+R4HVWfv2KegDVLGg4wnBqjVepvxR7S7R1GTwDZzEv52tpFipt6yA==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.1.tgz", + "integrity": "sha512-8yx2wIvkBjIq/MGY1D9h1LMraYW+z1X0mb648KZnKSdvLasvDu7maa0dFaNYdTDczFgbjNw2tOmWdTk9saVfwQ==", "dev": true, "dependencies": { "@sinonjs/commons": "^1.8.3", "@sinonjs/fake-timers": "^9.0.0", "@sinonjs/samsam": "^6.1.1", "diff": "^5.0.0", - "nise": "^5.1.0", + "nise": "^5.1.1", "supports-color": "^7.2.0" }, "funding": { @@ -5569,15 +5625,6 @@ "url": "https://opencollective.com/sinon" } }, - "node_modules/sinon/node_modules/@sinonjs/fake-timers": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.0.0.tgz", - "integrity": "sha512-+shXA2X7KNP7H7qNbQTJ3SA+NQc0pZDSBrdvFSRwF8sAo/ohw+ZQFD8Moc+gnz51+1eRXtEQBpKWPiQ4jsRC/w==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -5841,9 +5888,9 @@ } }, "node_modules/ts-node": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", - "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", + "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", "dev": true, "dependencies": { "@cspotcode/source-map-support": "0.7.0", @@ -5857,11 +5904,13 @@ "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.0", "yn": "3.1.1" }, "bin": { "ts-node": "dist/bin.js", "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js", "ts-script": "dist/bin-script-deprecated.js" @@ -5960,16 +6009,16 @@ } }, "node_modules/typedoc": { - "version": "0.22.11", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.11.tgz", - "integrity": "sha512-pVr3hh6dkS3lPPaZz1fNpvcrqLdtEvXmXayN55czlamSgvEjh+57GUqfhAI1Xsuu/hNHUT1KNSx8LH2wBP/7SA==", + "version": "0.22.13", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.13.tgz", + "integrity": "sha512-NHNI7Dr6JHa/I3+c62gdRNXBIyX7P33O9TafGLd07ur3MqzcKgwTvpg18EtvCLHJyfeSthAtCLpM7WkStUmDuQ==", "dev": true, "dependencies": { "glob": "^7.2.0", "lunr": "^2.3.9", - "marked": "^4.0.10", - "minimatch": "^3.0.4", - "shiki": "^0.10.0" + "marked": "^4.0.12", + "minimatch": "^5.0.1", + "shiki": "^0.10.1" }, "bin": { "typedoc": "bin/typedoc" @@ -5978,13 +6027,34 @@ "node": ">= 12.10.0" }, "peerDependencies": { - "typescript": "4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x || 4.5.x" + "typescript": "4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x || 4.5.x || 4.6.x" + } + }, + "node_modules/typedoc/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -6130,10 +6200,16 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz", + "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==", + "dev": true + }, "node_modules/vscode-oniguruma": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz", - "integrity": "sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz", + "integrity": "sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==", "dev": true }, "node_modules/vscode-textmate": { @@ -6200,6 +6276,12 @@ "node": ">=8" } }, + "node_modules/wildcard-match": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.2.tgz", + "integrity": "sha512-qNXwI591Z88c8bWxp+yjV60Ch4F8Riawe3iGxbzquhy8Xs9m+0+SLFBGb/0yCTIDElawtaImC37fYZ+dr32KqQ==", + "dev": true + }, "node_modules/windows-release": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", @@ -6345,9 +6427,9 @@ } }, "node_modules/yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.0.tgz", + "integrity": "sha512-WJudfrk81yWFSOkZYpAZx4Nt7V4xp7S/uJkX0CnxovMCt1wCE8LNftPpNuF9X/u9gN5nsD7ycYtRcDf2pL3UiA==", "dev": true, "dependencies": { "cliui": "^7.0.2", @@ -6399,9 +6481,9 @@ } }, "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", "dev": true, "engines": { "node": ">=12" @@ -6429,27 +6511,25 @@ } }, "packages/bloom": { - "name": "@node-redis/bloom", "version": "1.0.1", "license": "MIT", "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@node-redis/test-utils": "*", - "@types/node": "^17.0.13", + "@types/node": "^17.0.23", "nyc": "^15.1.0", - "release-it": "^14.12.4", + "release-it": "^14.13.1", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typedoc": "^0.22.11", - "typescript": "^4.5.5" + "ts-node": "^10.7.0", + "typedoc": "^0.22.13", + "typescript": "^4.6.3" }, "peerDependencies": { "@node-redis/client": "^1.0.0" } }, "packages/client": { - "name": "@node-redis/client", - "version": "1.0.4", + "version": "1.0.5", "license": "MIT", "dependencies": { "cluster-key-slot": "1.1.0", @@ -6460,114 +6540,109 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@node-redis/test-utils": "*", - "@types/node": "^17.0.13", + "@types/node": "^17.0.23", "@types/redis-parser": "^3.0.0", - "@types/sinon": "^10.0.9", + "@types/sinon": "^10.0.11", "@types/yallist": "^4.0.1", - "@typescript-eslint/eslint-plugin": "^5.10.1", - "@typescript-eslint/parser": "^5.10.1", - "eslint": "^8.8.0", + "@typescript-eslint/eslint-plugin": "^5.16.0", + "@typescript-eslint/parser": "^5.16.0", + "eslint": "^8.12.0", "nyc": "^15.1.0", - "release-it": "^14.12.4", - "sinon": "^13.0.0", + "release-it": "^14.13.1", + "sinon": "^13.0.1", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typedoc": "^0.22.11", - "typescript": "^4.5.5" + "ts-node": "^10.7.0", + "typedoc": "^0.22.13", + "typescript": "^4.6.3" }, "engines": { "node": ">=12" } }, "packages/graph": { - "name": "@node-redis/graph", "version": "1.0.0", "license": "MIT", "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@node-redis/test-utils": "*", - "@types/node": "^17.0.13", + "@types/node": "^17.0.23", "nyc": "^15.1.0", - "release-it": "^14.12.4", + "release-it": "^14.13.1", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typedoc": "^0.22.11", - "typescript": "^4.5.5" + "ts-node": "^10.7.0", + "typedoc": "^0.22.13", + "typescript": "^4.6.3" }, "peerDependencies": { "@node-redis/client": "^1.0.0" } }, "packages/json": { - "name": "@node-redis/json", "version": "1.0.2", "license": "MIT", "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@node-redis/test-utils": "*", - "@types/node": "^17.0.13", + "@types/node": "^17.0.23", "nyc": "^15.1.0", - "release-it": "^14.12.4", + "release-it": "^14.13.1", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typedoc": "^0.22.11", - "typescript": "^4.5.5" + "ts-node": "^10.7.0", + "typedoc": "^0.22.13", + "typescript": "^4.6.3" }, "peerDependencies": { "@node-redis/client": "^1.0.0" } }, "packages/search": { - "name": "@node-redis/search", - "version": "1.0.3", + "version": "1.0.5", "license": "MIT", "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@node-redis/test-utils": "*", - "@types/node": "^17.0.13", + "@types/node": "^17.0.23", "nyc": "^15.1.0", - "release-it": "^14.12.4", + "release-it": "^14.13.1", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typedoc": "^0.22.11", - "typescript": "^4.5.5" + "ts-node": "^10.7.0", + "typedoc": "^0.22.13", + "typescript": "^4.6.3" }, "peerDependencies": { "@node-redis/client": "^1.0.0" } }, "packages/test-utils": { - "name": "@node-redis/test-utils", "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@types/mocha": "^9.1.0", - "@types/node": "^17.0.13", - "@types/yargs": "^17.0.8", - "mocha": "^9.2.0", + "@types/node": "^17.0.23", + "@types/yargs": "^17.0.10", + "mocha": "^9.2.2", "nyc": "^15.1.0", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typescript": "^4.5.5", - "yargs": "^17.3.1" + "ts-node": "^10.7.0", + "typescript": "^4.6.3", + "yargs": "^17.4.0" }, "peerDependencies": { "@node-redis/client": "^1.0.0" } }, "packages/time-series": { - "name": "@node-redis/time-series", "version": "1.0.2", "license": "MIT", "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@node-redis/test-utils": "*", - "@types/node": "^17.0.13", + "@types/node": "^17.0.23", "nyc": "^15.1.0", - "release-it": "^14.12.4", + "release-it": "^14.13.1", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typedoc": "^0.22.11", - "typescript": "^4.5.5" + "ts-node": "^10.7.0", + "typedoc": "^0.22.13", + "typescript": "^4.6.3" }, "peerDependencies": { "@node-redis/client": "^1.0.0" @@ -6575,6 +6650,15 @@ } }, "dependencies": { + "@ampproject/remapping": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", + "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.0" + } + }, "@babel/code-frame": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", @@ -6585,52 +6669,52 @@ } }, "@babel/compat-data": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", - "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", "dev": true }, "@babel/core": { - "version": "7.16.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", - "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", + "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", "dev": true, "requires": { + "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.8", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.16.7", - "@babel/parser": "^7.16.12", + "@babel/generator": "^7.17.7", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.8", + "@babel/parser": "^7.17.8", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.10", - "@babel/types": "^7.16.8", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "semver": "^6.3.0" } }, "@babel/generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", - "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", + "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", "dev": true, "requires": { - "@babel/types": "^7.16.8", + "@babel/types": "^7.17.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", "dev": true, "requires": { - "@babel/compat-data": "^7.16.4", + "@babel/compat-data": "^7.17.7", "@babel/helper-validator-option": "^7.16.7", "browserslist": "^4.17.5", "semver": "^6.3.0" @@ -6684,28 +6768,28 @@ } }, "@babel/helper-module-transforms": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", - "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", "@babel/helper-split-export-declaration": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" } }, "@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.17.0" } }, "@babel/helper-split-export-declaration": { @@ -6730,14 +6814,14 @@ "dev": true }, "@babel/helpers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", - "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", + "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", "dev": true, "requires": { "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" } }, "@babel/highlight": { @@ -6804,9 +6888,9 @@ } }, "@babel/parser": { - "version": "7.16.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", + "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", "dev": true }, "@babel/template": { @@ -6821,19 +6905,19 @@ } }, "@babel/traverse": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", - "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.8", + "@babel/generator": "^7.17.3", "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-function-name": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.10", - "@babel/types": "^7.16.8", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -6847,9 +6931,9 @@ } }, "@babel/types": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", - "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -6872,28 +6956,22 @@ } }, "@eslint/eslintrc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", + "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.2.0", + "espree": "^9.3.1", "globals": "^13.9.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -6903,9 +6981,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", - "integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==", + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -6986,18 +7064,40 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", + "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@node-redis/bloom": { "version": "file:packages/bloom", "requires": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@node-redis/test-utils": "*", - "@types/node": "^17.0.13", + "@types/node": "^17.0.23", "nyc": "^15.1.0", - "release-it": "^14.12.4", + "release-it": "^14.13.1", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typedoc": "^0.22.11", - "typescript": "^4.5.5" + "ts-node": "^10.7.0", + "typedoc": "^0.22.13", + "typescript": "^4.6.3" } }, "@node-redis/client": { @@ -7005,23 +7105,23 @@ "requires": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@node-redis/test-utils": "*", - "@types/node": "^17.0.13", + "@types/node": "^17.0.23", "@types/redis-parser": "^3.0.0", - "@types/sinon": "^10.0.9", + "@types/sinon": "^10.0.11", "@types/yallist": "^4.0.1", - "@typescript-eslint/eslint-plugin": "^5.10.1", - "@typescript-eslint/parser": "^5.10.1", + "@typescript-eslint/eslint-plugin": "^5.16.0", + "@typescript-eslint/parser": "^5.16.0", "cluster-key-slot": "1.1.0", - "eslint": "^8.8.0", + "eslint": "^8.12.0", "generic-pool": "3.8.2", "nyc": "^15.1.0", "redis-parser": "3.0.0", - "release-it": "^14.12.4", - "sinon": "^13.0.0", + "release-it": "^14.13.1", + "sinon": "^13.0.1", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typedoc": "^0.22.11", - "typescript": "^4.5.5", + "ts-node": "^10.7.0", + "typedoc": "^0.22.13", + "typescript": "^4.6.3", "yallist": "4.0.0" } }, @@ -7030,13 +7130,13 @@ "requires": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@node-redis/test-utils": "*", - "@types/node": "^17.0.13", + "@types/node": "^17.0.23", "nyc": "^15.1.0", - "release-it": "^14.12.4", + "release-it": "^14.13.1", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typedoc": "^0.22.11", - "typescript": "^4.5.5" + "ts-node": "^10.7.0", + "typedoc": "^0.22.13", + "typescript": "^4.6.3" } }, "@node-redis/json": { @@ -7044,13 +7144,13 @@ "requires": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@node-redis/test-utils": "*", - "@types/node": "^17.0.13", + "@types/node": "^17.0.23", "nyc": "^15.1.0", - "release-it": "^14.12.4", + "release-it": "^14.13.1", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typedoc": "^0.22.11", - "typescript": "^4.5.5" + "ts-node": "^10.7.0", + "typedoc": "^0.22.13", + "typescript": "^4.6.3" } }, "@node-redis/search": { @@ -7058,13 +7158,13 @@ "requires": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@node-redis/test-utils": "*", - "@types/node": "^17.0.13", + "@types/node": "^17.0.23", "nyc": "^15.1.0", - "release-it": "^14.12.4", + "release-it": "^14.13.1", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typedoc": "^0.22.11", - "typescript": "^4.5.5" + "ts-node": "^10.7.0", + "typedoc": "^0.22.13", + "typescript": "^4.6.3" } }, "@node-redis/test-utils": { @@ -7072,14 +7172,14 @@ "requires": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@types/mocha": "^9.1.0", - "@types/node": "^17.0.13", - "@types/yargs": "^17.0.8", - "mocha": "^9.2.0", + "@types/node": "^17.0.23", + "@types/yargs": "^17.0.10", + "mocha": "^9.2.2", "nyc": "^15.1.0", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typescript": "^4.5.5", - "yargs": "^17.3.1" + "ts-node": "^10.7.0", + "typescript": "^4.6.3", + "yargs": "^17.4.0" } }, "@node-redis/time-series": { @@ -7087,13 +7187,13 @@ "requires": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@node-redis/test-utils": "*", - "@types/node": "^17.0.13", + "@types/node": "^17.0.23", "nyc": "^15.1.0", - "release-it": "^14.12.4", + "release-it": "^14.13.1", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typedoc": "^0.22.11", - "typescript": "^4.5.5" + "ts-node": "^10.7.0", + "typedoc": "^0.22.13", + "typescript": "^4.6.3" } }, "@nodelib/fs.scandir": { @@ -7132,14 +7232,14 @@ } }, "@octokit/core": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.5.1.tgz", - "integrity": "sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", + "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", "dev": true, "requires": { "@octokit/auth-token": "^2.4.4", "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.0", + "@octokit/request": "^5.6.3", "@octokit/request-error": "^2.0.5", "@octokit/types": "^6.0.3", "before-after-hook": "^2.2.0", @@ -7247,9 +7347,9 @@ } }, "@sindresorhus/is": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.4.0.tgz", - "integrity": "sha512-QppPM/8l3Mawvh4rn9CNEYIU9bxpXUCRMaX9yUpvBk1nMKusLKpfXGDEKExKaPhLzcn3lzil7pR6rnJ11HgeRQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true }, "@sinonjs/commons": { @@ -7262,9 +7362,9 @@ } }, "@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.1.tgz", + "integrity": "sha512-Wp5vwlZ0lOqpSYGKqr53INws9HLkt6JDc/pDZcPf7bchQnrXJMXPns8CXx0hFikMSGSWfvtvvpb2gtMVfkWagA==", "dev": true, "requires": { "@sinonjs/commons": "^1.7.0" @@ -7339,15 +7439,15 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "@types/keyv": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", - "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dev": true, "requires": { "@types/node": "*" @@ -7360,9 +7460,9 @@ "dev": true }, "@types/node": { - "version": "17.0.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.13.tgz", - "integrity": "sha512-Y86MAxASe25hNzlDbsviXl8jQHb0RDvKt4c40ZJQ1Don0AAL0STLZSs4N+6gLEO55pedy7r2cLwS+ZDxPm/2Bw==", + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", "dev": true }, "@types/parse-json": { @@ -7397,14 +7497,20 @@ } }, "@types/sinon": { - "version": "10.0.9", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.9.tgz", - "integrity": "sha512-xGZVAe61omKnVGedBdTbAveuJ5QyI0LrMIcp0hc1LmVI5IEjs5qG4fM0sv9GIBA2JVoKuf7332IjQX4y5qqMMQ==", + "version": "10.0.11", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.11.tgz", + "integrity": "sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g==", "dev": true, "requires": { - "@sinonjs/fake-timers": "^7.1.0" + "@types/sinonjs__fake-timers": "*" } }, + "@types/sinonjs__fake-timers": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", + "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", + "dev": true + }, "@types/yallist": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/yallist/-/yallist-4.0.1.tgz", @@ -7412,29 +7518,29 @@ "dev": true }, "@types/yargs": { - "version": "17.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.8.tgz", - "integrity": "sha512-wDeUwiUmem9FzsyysEwRukaEdDNcwbROvQ9QGRKaLI6t+IltNzbn4/i4asmB10auvZGQCzSQ6t0GSczEThlUXw==", + "version": "17.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", + "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.1.tgz", - "integrity": "sha512-xN3CYqFlyE/qOcy978/L0xLR2HlcAGIyIK5sMOasxaaAPfQRj/MmMV6OC3I7NZO84oEUdWCOju34Z9W8E0pFDQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.17.0.tgz", + "integrity": "sha512-qVstvQilEd89HJk3qcbKt/zZrfBZ+9h2ynpAGlWjWiizA7m/MtLT9RoX6gjtpE500vfIg8jogAkDzdCxbsFASQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.10.1", - "@typescript-eslint/type-utils": "5.10.1", - "@typescript-eslint/utils": "5.10.1", + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/type-utils": "5.17.0", + "@typescript-eslint/utils": "5.17.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -7455,52 +7561,52 @@ } }, "@typescript-eslint/parser": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.1.tgz", - "integrity": "sha512-GReo3tjNBwR5RnRO0K2wDIDN31cM3MmDtgyQ85oAxAmC5K3j/g85IjP+cDfcqDsDDBf1HNKQAD0WqOYL8jXqUA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.17.0.tgz", + "integrity": "sha512-aRzW9Jg5Rlj2t2/crzhA2f23SIYFlF9mchGudyP0uiD6SenIxzKoLjwzHbafgHn39dNV/TV7xwQkLfFTZlJ4ig==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.10.1", - "@typescript-eslint/types": "5.10.1", - "@typescript-eslint/typescript-estree": "5.10.1", + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/typescript-estree": "5.17.0", "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.1.tgz", - "integrity": "sha512-Lyvi559Gvpn94k7+ElXNMEnXu/iundV5uFmCUNnftbFrUbAJ1WBoaGgkbOBm07jVZa682oaBU37ao/NGGX4ZDg==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.17.0.tgz", + "integrity": "sha512-062iCYQF/doQ9T2WWfJohQKKN1zmmXVfAcS3xaiialiw8ZUGy05Em6QVNYJGO34/sU1a7a+90U3dUNfqUDHr3w==", "dev": true, "requires": { - "@typescript-eslint/types": "5.10.1", - "@typescript-eslint/visitor-keys": "5.10.1" + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/visitor-keys": "5.17.0" } }, "@typescript-eslint/type-utils": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.1.tgz", - "integrity": "sha512-AfVJkV8uck/UIoDqhu+ptEdBoQATON9GXnhOpPLzkQRJcSChkvD//qsz9JVffl2goxX+ybs5klvacE9vmrQyCw==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.17.0.tgz", + "integrity": "sha512-3hU0RynUIlEuqMJA7dragb0/75gZmwNwFf/QJokWzPehTZousP/MNifVSgjxNcDCkM5HI2K22TjQWUmmHUINSg==", "dev": true, "requires": { - "@typescript-eslint/utils": "5.10.1", + "@typescript-eslint/utils": "5.17.0", "debug": "^4.3.2", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.1.tgz", - "integrity": "sha512-ZvxQ2QMy49bIIBpTqFiOenucqUyjTQ0WNLhBM6X1fh1NNlYAC6Kxsx8bRTY3jdYsYg44a0Z/uEgQkohbR0H87Q==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.17.0.tgz", + "integrity": "sha512-AgQ4rWzmCxOZLioFEjlzOI3Ch8giDWx8aUDxyNw9iOeCvD3GEYAB7dxWGQy4T/rPVe8iPmu73jPHuaSqcjKvxw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.1.tgz", - "integrity": "sha512-PwIGnH7jIueXv4opcwEbVGDATjGPO1dx9RkUl5LlHDSe+FXxPwFL5W/qYd5/NHr7f6lo/vvTrAzd0KlQtRusJQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.17.0.tgz", + "integrity": "sha512-X1gtjEcmM7Je+qJRhq7ZAAaNXYhTgqMkR10euC4Si6PIjb+kwEQHSxGazXUQXFyqfEXdkGf6JijUu5R0uceQzg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.10.1", - "@typescript-eslint/visitor-keys": "5.10.1", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/visitor-keys": "5.17.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -7540,26 +7646,26 @@ } }, "@typescript-eslint/utils": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.1.tgz", - "integrity": "sha512-RRmlITiUbLuTRtn/gcPRi4202niF+q7ylFLCKu4c+O/PcpRvZ/nAUwQ2G00bZgpWkhrNLNnvhZLbDn8Ml0qsQw==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.17.0.tgz", + "integrity": "sha512-DVvndq1QoxQH+hFv+MUQHrrWZ7gQ5KcJzyjhzcqB1Y2Xes1UQQkTRPUfRpqhS8mhTWsSb2+iyvDW1Lef5DD7vA==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.10.1", - "@typescript-eslint/types": "5.10.1", - "@typescript-eslint/typescript-estree": "5.10.1", + "@typescript-eslint/scope-manager": "5.17.0", + "@typescript-eslint/types": "5.17.0", + "@typescript-eslint/typescript-estree": "5.17.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/visitor-keys": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.1.tgz", - "integrity": "sha512-NjQ0Xinhy9IL979tpoTRuLKxMc0zJC7QVSdeerXs2/QvOy2yRkzX5dRb10X5woNUdJgU8G3nYRDlI33sq1K4YQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.17.0.tgz", + "integrity": "sha512-6K/zlc4OfCagUu7Am/BD5k8PSWQOgh34Nrv9Rxe2tBzlJ7uOeJ/h7ugCGDCeEZHT6k2CJBhbk9IsbkPI0uvUkA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.10.1", + "@typescript-eslint/types": "5.17.0", "eslint-visitor-keys": "^3.0.0" } }, @@ -7810,15 +7916,15 @@ "dev": true }, "browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", - "node-releases": "^2.0.1", + "node-releases": "^2.0.2", "picocolors": "^1.0.0" } }, @@ -7905,9 +8011,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001304", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001304.tgz", - "integrity": "sha512-bdsfZd6K6ap87AGqSHJP/s1V+U6Z5lyrcbBu3ovbCCf8cSYpwTtGrCBObMpJqwxfTbLW6YTIdbb1jEeTelcpYQ==", + "version": "1.0.30001323", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001323.tgz", + "integrity": "sha512-e4BF2RlCVELKx8+RmklSEIVub1TWrmdhvA5kEUueummz1XyySW0DVk+3x9HyhU9MuWTa2BhqLgEuEmUwASAdCA==", "dev": true }, "chalk": { @@ -8247,9 +8353,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.57", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.57.tgz", - "integrity": "sha512-FNC+P5K1n6pF+M0zIK+gFCoXcJhhzDViL3DRIGy2Fv5PohuSES1JHR7T+GlwxSxlzx4yYbsuzCZvHxcBSRCIOw==", + "version": "1.4.103", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", + "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==", "dev": true }, "email-addresses": { @@ -8307,12 +8413,12 @@ "dev": true }, "eslint": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz", - "integrity": "sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.12.0.tgz", + "integrity": "sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.0.5", + "@eslint/eslintrc": "^1.2.1", "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -8320,10 +8426,10 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", + "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.2.0", - "espree": "^9.3.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -8356,9 +8462,9 @@ "dev": true }, "eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -8416,20 +8522,20 @@ } }, "eslint-visitor-keys": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", - "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true }, "espree": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", - "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", + "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", "dev": true, "requires": { "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" + "eslint-visitor-keys": "^3.3.0" } }, "esprima": { @@ -8815,9 +8921,9 @@ } }, "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -8891,9 +8997,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, "has-yarn": { @@ -9332,9 +9438,9 @@ } }, "istanbul-reports": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz", - "integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", + "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -9387,13 +9493,10 @@ "dev": true }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true }, "jsonc-parser": { "version": "3.0.0", @@ -9417,9 +9520,9 @@ "dev": true }, "keyv": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.5.tgz", - "integrity": "sha512-531pkGLqV3BMg0eDqqJFI0R1mkK1Nm5xIP2mM6keP5P8WfFtCkg2IOwplTUmlGoTgIg9yQYZ/kdihhz89XH3vA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", + "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", "dev": true, "requires": { "json-buffer": "3.0.1" @@ -9554,13 +9657,13 @@ "dev": true }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mime-db": { @@ -9591,24 +9694,24 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "mocha": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.0.tgz", - "integrity": "sha512-kNn7E8g2SzVcq0a77dkphPsDSN7P+iYkqE0ZsGCYWRsoiKjOt+NvXfaagik8vuDa6W5Zw3qxe8Jfpt5qKf+6/Q==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", @@ -9624,9 +9727,9 @@ "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", - "minimatch": "3.0.4", + "minimatch": "4.2.1", "ms": "2.1.3", - "nanoid": "3.2.0", + "nanoid": "3.3.1", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", @@ -9662,6 +9765,15 @@ "p-locate": "^5.0.0" } }, + "minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -9737,9 +9849,9 @@ "dev": true }, "nanoid": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", - "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", "dev": true }, "natural-compare": { @@ -9766,13 +9878,13 @@ } }, "nise": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", - "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", + "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", "dev": true, "requires": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": ">=5", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", "path-to-regexp": "^1.7.0" @@ -9797,9 +9909,9 @@ } }, "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", "dev": true }, "normalize-path": { @@ -10524,9 +10636,9 @@ } }, "release-it": { - "version": "14.12.4", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.12.4.tgz", - "integrity": "sha512-lqf9PMsj7ycCqFHGag8Uv7cE1hNsKa+yKUMe+Fkh9fdOfxu2F01On+YUefRCP0DuQthmr/WyLCYdrjThMEkWFQ==", + "version": "14.13.1", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.13.1.tgz", + "integrity": "sha512-mrng5bqZDFMr/7oCH3kuflwjKpKki4dUp6yYGxs20scYCvvd8rHAI5pdQOJHwI5BKHAC/pad0UjAEycMWQnEIw==", "dev": true, "requires": { "@iarna/toml": "2.2.5", @@ -10555,6 +10667,7 @@ "update-notifier": "5.1.0", "url-join": "4.0.1", "uuid": "8.3.2", + "wildcard-match": "5.1.2", "yaml": "1.10.2", "yargs-parser": "20.2.9" }, @@ -10690,9 +10803,9 @@ } }, "rxjs": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.2.tgz", - "integrity": "sha512-PwDt186XaL3QN5qXj/H9DGyHhP3/RYYgZZwqBv9Tv8rsAaiwFH1IsJJlcgD37J7UW5a6O67qX0KWKS3/pu0m4w==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", "dev": true, "requires": { "tslib": "^2.1.0" @@ -10767,9 +10880,9 @@ } }, "shiki": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.0.tgz", - "integrity": "sha512-iczxaIYeBFHTFrQPb9DVy2SKgYxC4Wo7Iucm7C17cCh2Ge/refnvHscUOxM85u57MfLoNOtjoEFUWt9gBexblA==", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.1.tgz", + "integrity": "sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==", "dev": true, "requires": { "jsonc-parser": "^3.0.0", @@ -10789,34 +10902,23 @@ } }, "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "sinon": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.0.tgz", - "integrity": "sha512-3tjMDB/tY04b06Bnb4aMKQfNrau2C9HET+R4HVWfv2KegDVLGg4wnBqjVepvxR7S7R1GTwDZzEv52tpFipt6yA==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.1.tgz", + "integrity": "sha512-8yx2wIvkBjIq/MGY1D9h1LMraYW+z1X0mb648KZnKSdvLasvDu7maa0dFaNYdTDczFgbjNw2tOmWdTk9saVfwQ==", "dev": true, "requires": { "@sinonjs/commons": "^1.8.3", "@sinonjs/fake-timers": "^9.0.0", "@sinonjs/samsam": "^6.1.1", "diff": "^5.0.0", - "nise": "^5.1.0", + "nise": "^5.1.1", "supports-color": "^7.2.0" - }, - "dependencies": { - "@sinonjs/fake-timers": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.0.0.tgz", - "integrity": "sha512-+shXA2X7KNP7H7qNbQTJ3SA+NQc0pZDSBrdvFSRwF8sAo/ohw+ZQFD8Moc+gnz51+1eRXtEQBpKWPiQ4jsRC/w==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - } } }, "slash": { @@ -11021,9 +11123,9 @@ } }, "ts-node": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", - "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", + "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", "dev": true, "requires": { "@cspotcode/source-map-support": "0.7.0", @@ -11037,6 +11139,7 @@ "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.0", "yn": "3.1.1" }, "dependencies": { @@ -11102,22 +11205,42 @@ } }, "typedoc": { - "version": "0.22.11", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.11.tgz", - "integrity": "sha512-pVr3hh6dkS3lPPaZz1fNpvcrqLdtEvXmXayN55czlamSgvEjh+57GUqfhAI1Xsuu/hNHUT1KNSx8LH2wBP/7SA==", + "version": "0.22.13", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.13.tgz", + "integrity": "sha512-NHNI7Dr6JHa/I3+c62gdRNXBIyX7P33O9TafGLd07ur3MqzcKgwTvpg18EtvCLHJyfeSthAtCLpM7WkStUmDuQ==", "dev": true, "requires": { "glob": "^7.2.0", "lunr": "^2.3.9", - "marked": "^4.0.10", - "minimatch": "^3.0.4", - "shiki": "^0.10.0" + "marked": "^4.0.12", + "minimatch": "^5.0.1", + "shiki": "^0.10.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", "dev": true }, "unique-string": { @@ -11231,10 +11354,16 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "v8-compile-cache-lib": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz", + "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==", + "dev": true + }, "vscode-oniguruma": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz", - "integrity": "sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.2.tgz", + "integrity": "sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==", "dev": true }, "vscode-textmate": { @@ -11292,6 +11421,12 @@ "string-width": "^4.0.0" } }, + "wildcard-match": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.2.tgz", + "integrity": "sha512-qNXwI591Z88c8bWxp+yjV60Ch4F8Riawe3iGxbzquhy8Xs9m+0+SLFBGb/0yCTIDElawtaImC37fYZ+dr32KqQ==", + "dev": true + }, "windows-release": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", @@ -11400,9 +11535,9 @@ "dev": true }, "yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.0.tgz", + "integrity": "sha512-WJudfrk81yWFSOkZYpAZx4Nt7V4xp7S/uJkX0CnxovMCt1wCE8LNftPpNuF9X/u9gN5nsD7ycYtRcDf2pL3UiA==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -11415,9 +11550,9 @@ }, "dependencies": { "yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", "dev": true } } diff --git a/package.json b/package.json index c1b4e3bd8f..e8ce338065 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "redis", "description": "A modern, high performance Redis client", - "version": "4.0.4", + "version": "4.0.6", "license": "MIT", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -24,17 +24,17 @@ }, "dependencies": { "@node-redis/bloom": "1.0.1", - "@node-redis/client": "1.0.4", + "@node-redis/client": "1.0.5", "@node-redis/graph": "1.0.0", "@node-redis/json": "1.0.2", - "@node-redis/search": "1.0.3", + "@node-redis/search": "1.0.5", "@node-redis/time-series": "1.0.2" }, "devDependencies": { "@tsconfig/node12": "^1.0.9", "gh-pages": "^3.2.3", - "release-it": "^14.12.1", - "typescript": "^4.5.4" + "release-it": "^14.13.1", + "typescript": "^4.6.3" }, "repository": { "type": "git", diff --git a/packages/bloom/package.json b/packages/bloom/package.json index e16b512ec5..a7a0a07a13 100644 --- a/packages/bloom/package.json +++ b/packages/bloom/package.json @@ -18,12 +18,12 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@node-redis/test-utils": "*", - "@types/node": "^17.0.13", + "@types/node": "^17.0.23", "nyc": "^15.1.0", - "release-it": "^14.12.4", + "release-it": "^14.13.1", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typedoc": "^0.22.11", - "typescript": "^4.5.5" + "ts-node": "^10.7.0", + "typedoc": "^0.22.13", + "typescript": "^4.6.3" } } diff --git a/packages/client/lib/client/commands.ts b/packages/client/lib/client/commands.ts index c227f7f29b..40c78b070e 100644 --- a/packages/client/lib/client/commands.ts +++ b/packages/client/lib/client/commands.ts @@ -23,16 +23,33 @@ import * as CLIENT_KILL from '../commands/CLIENT_KILL'; import * as CLIENT_SETNAME from '../commands/CLIENT_SETNAME'; import * as CLIENT_INFO from '../commands/CLIENT_INFO'; import * as CLUSTER_ADDSLOTS from '../commands/CLUSTER_ADDSLOTS'; +import * as CLUSTER_ADDSLOTSRANGE from '../commands/CLUSTER_ADDSLOTSRANGE'; +import * as CLUSTER_BUMPEPOCH from '../commands/CLUSTER_BUMPEPOCH'; +import * as CLUSTER_COUNT_FAILURE_REPORTS from '../commands/CLUSTER_COUNT-FAILURE-REPORTS'; +import * as CLUSTER_COUNTKEYSINSLOT from '../commands/CLUSTER_COUNTKEYSINSLOT'; +import * as CLUSTER_DELSLOTS from '../commands/CLUSTER_DELSLOTS'; +import * as CLUSTER_DELSLOTSRANGE from '../commands/CLUSTER_DELSLOTSRANGE'; +import * as CLUSTER_FAILOVER from '../commands/CLUSTER_FAILOVER'; import * as CLUSTER_FLUSHSLOTS from '../commands/CLUSTER_FLUSHSLOTS'; +import * as CLUSTER_FORGET from '../commands/CLUSTER_FORGET'; +import * as CLUSTER_GETKEYSINSLOT from '../commands/CLUSTER_GETKEYSINSLOT'; import * as CLUSTER_INFO from '../commands/CLUSTER_INFO'; -import * as CLUSTER_NODES from '../commands/CLUSTER_NODES'; +import * as CLUSTER_KEYSLOT from '../commands/CLUSTER_KEYSLOT'; +import * as CLUSTER_LINKS from '../commands/CLUSTER_LINKS'; import * as CLUSTER_MEET from '../commands/CLUSTER_MEET'; +import * as CLUSTER_MYID from '../commands/CLUSTER_MYID'; +import * as CLUSTER_NODES from '../commands/CLUSTER_NODES'; +import * as CLUSTER_REPLICAS from '../commands/CLUSTER_REPLICAS'; +import * as CLUSTER_REPLICATE from '../commands/CLUSTER_REPLICATE'; import * as CLUSTER_RESET from '../commands/CLUSTER_RESET'; +import * as CLUSTER_SAVECONFIG from '../commands/CLUSTER_SAVECONFIG'; +import * as CLUSTER_SET_CONFIG_EPOCH from '../commands/CLUSTER_SET-CONFIG-EPOCH'; import * as CLUSTER_SETSLOT from '../commands/CLUSTER_SETSLOT'; import * as CLUSTER_SLOTS from '../commands/CLUSTER_SLOTS'; import * as COMMAND_COUNT from '../commands/COMMAND_COUNT'; import * as COMMAND_DOCS from '../commands/COMMAND_DOCS'; import * as COMMAND_GETKEYS from '../commands/COMMAND_GETKEYS'; +import * as COMMAND_GETKEYSANDFLAGS from '../commands/COMMAND_GETKEYSANDFLAGS'; import * as COMMAND_INFO from '../commands/COMMAND_INFO'; import * as COMMAND_LIST from '../commands/COMMAND_LIST'; import * as COMMAND from '../commands/COMMAND'; @@ -82,6 +99,7 @@ import * as SWAPDB from '../commands/SWAPDB'; import * as TIME from '../commands/TIME'; import * as UNWATCH from '../commands/UNWATCH'; import * as WAIT from '../commands/WAIT'; +import * as LATENCY_DOCTOR from '../commands/LATENCY_DOCTOR'; export default { ...CLUSTER_COMMANDS, @@ -133,16 +151,48 @@ export default { clientInfo: CLIENT_INFO, CLUSTER_ADDSLOTS, clusterAddSlots: CLUSTER_ADDSLOTS, + CLUSTER_ADDSLOTSRANGE, + clusterAddSlotsRange: CLUSTER_ADDSLOTSRANGE, + CLUSTER_BUMPEPOCH, + clusterBumpEpoch: CLUSTER_BUMPEPOCH, + CLUSTER_COUNT_FAILURE_REPORTS, + clusterCountFailureReports: CLUSTER_COUNT_FAILURE_REPORTS, + CLUSTER_COUNTKEYSINSLOT, + clusterCountKeysInSlot: CLUSTER_COUNTKEYSINSLOT, + CLUSTER_DELSLOTS, + clusterDelSlots: CLUSTER_DELSLOTS, + CLUSTER_DELSLOTSRANGE, + clusterDelSlotsRange: CLUSTER_DELSLOTSRANGE, + CLUSTER_FAILOVER, + clusterFailover: CLUSTER_FAILOVER, CLUSTER_FLUSHSLOTS, clusterFlushSlots: CLUSTER_FLUSHSLOTS, + CLUSTER_FORGET, + clusterForget: CLUSTER_FORGET, + CLUSTER_GETKEYSINSLOT, + clusterGetKeysInSlot: CLUSTER_GETKEYSINSLOT, CLUSTER_INFO, clusterInfo: CLUSTER_INFO, - CLUSTER_NODES, - clusterNodes: CLUSTER_NODES, + CLUSTER_KEYSLOT, + clusterKeySlot: CLUSTER_KEYSLOT, + CLUSTER_LINKS, + clusterLinks: CLUSTER_LINKS, CLUSTER_MEET, clusterMeet: CLUSTER_MEET, + CLUSTER_MYID, + clusterMyId: CLUSTER_MYID, + CLUSTER_NODES, + clusterNodes: CLUSTER_NODES, + CLUSTER_REPLICAS, + clusterReplicas: CLUSTER_REPLICAS, + CLUSTER_REPLICATE, + clusterReplicate: CLUSTER_REPLICATE, CLUSTER_RESET, clusterReset: CLUSTER_RESET, + CLUSTER_SAVECONFIG, + clusterSaveConfig: CLUSTER_SAVECONFIG, + CLUSTER_SET_CONFIG_EPOCH, + clusterSetConfigEpoch: CLUSTER_SET_CONFIG_EPOCH, CLUSTER_SETSLOT, clusterSetSlot: CLUSTER_SETSLOT, CLUSTER_SLOTS, @@ -153,6 +203,8 @@ export default { commandDocs: COMMAND_DOCS, COMMAND_GETKEYS, commandGetKeys: COMMAND_GETKEYS, + COMMAND_GETKEYSANDFLAGS, + commandGetKeysAndFlags: COMMAND_GETKEYSANDFLAGS, COMMAND_INFO, commandInfo: COMMAND_INFO, COMMAND_LIST, @@ -187,6 +239,8 @@ export default { keys: KEYS, LASTSAVE, lastSave: LASTSAVE, + LATENCY_DOCTOR, + latencyDoctor: LATENCY_DOCTOR, LOLWUT, lolwut: LOLWUT, MEMOERY_DOCTOR, diff --git a/packages/client/lib/client/index.spec.ts b/packages/client/lib/client/index.spec.ts index d52086da41..308ce1e9c4 100644 --- a/packages/client/lib/client/index.spec.ts +++ b/packages/client/lib/client/index.spec.ts @@ -477,8 +477,11 @@ describe('Client', () => { assert.ok(id !== isolatedId); }, GLOBAL.SERVERS.OPEN); - async function killClient(client: RedisClientType): Promise { - const onceErrorPromise = once(client, 'error'); + async function killClient( + client: RedisClientType, + errorClient: RedisClientType = client + ): Promise { + const onceErrorPromise = once(errorClient, 'error'); await client.sendCommand(['QUIT']); await Promise.all([ onceErrorPromise, @@ -503,6 +506,10 @@ describe('Client', () => { minimumDockerVersion: [6, 2] // CLIENT INFO }); + testUtils.testWithClient('should propagated errors from "isolated" clients', client => { + return client.executeIsolated(isolated => killClient(isolated, client)); + }, GLOBAL.SERVERS.OPEN); + testUtils.testWithClient('scanIterator', async client => { const promises = [], keys = new Set(); diff --git a/packages/client/lib/client/index.ts b/packages/client/lib/client/index.ts index da0b95bd42..1dd74fa1af 100644 --- a/packages/client/lib/client/index.ts +++ b/packages/client/lib/client/index.ts @@ -189,7 +189,7 @@ export default class RedisClient create: async () => { const duplicate = this.duplicate({ isolationPoolOptions: undefined - }); + }).on('error', err => this.emit('error', err)); await duplicate.connect(); return duplicate; }, diff --git a/packages/client/lib/client/socket.spec.ts b/packages/client/lib/client/socket.spec.ts index 263320bbf7..4c5cfd1d9b 100644 --- a/packages/client/lib/client/socket.spec.ts +++ b/packages/client/lib/client/socket.spec.ts @@ -6,7 +6,7 @@ describe('Socket', () => { describe('reconnectStrategy', () => { let clock: SinonFakeTimers; beforeEach(() => clock = useFakeTimers()); - afterEach(() => clock.uninstall()); + afterEach(() => clock.restore()); it('custom strategy', () => { const reconnectStrategy = spy((retries: number): number | Error => { diff --git a/packages/client/lib/cluster/commands.ts b/packages/client/lib/cluster/commands.ts index b8893d9710..4a2c7e8503 100644 --- a/packages/client/lib/cluster/commands.ts +++ b/packages/client/lib/cluster/commands.ts @@ -21,6 +21,7 @@ import * as EVALSHA from '../commands/EVALSHA'; import * as EXISTS from '../commands/EXISTS'; import * as EXPIRE from '../commands/EXPIRE'; import * as EXPIREAT from '../commands/EXPIREAT'; +import * as EXPIRETIME from '../commands/EXPIRETIME'; import * as GEOADD from '../commands/GEOADD'; import * as GEODIST from '../commands/GEODIST'; import * as GEOHASH from '../commands/GEOHASH'; @@ -72,9 +73,14 @@ import * as MGET from '../commands/MGET'; import * as MIGRATE from '../commands/MIGRATE'; import * as MSET from '../commands/MSET'; import * as MSETNX from '../commands/MSETNX'; +import * as OBJECT_ENCODING from '../commands/OBJECT_ENCODING'; +import * as OBJECT_FREQ from '../commands/OBJECT_FREQ'; +import * as OBJECT_IDLETIME from '../commands/OBJECT_IDLETIME'; +import * as OBJECT_REFCOUNT from '../commands/OBJECT_REFCOUNT'; import * as PERSIST from '../commands/PERSIST'; import * as PEXPIRE from '../commands/PEXPIRE'; import * as PEXPIREAT from '../commands/PEXPIREAT'; +import * as PEXPIRETIME from '../commands/PEXPIRETIME'; import * as PFADD from '../commands/PFADD'; import * as PFCOUNT from '../commands/PFCOUNT'; import * as PFMERGE from '../commands/PFMERGE'; @@ -98,11 +104,14 @@ import * as SETEX from '../commands/SETEX'; import * as SETNX from '../commands/SETNX'; import * as SETRANGE from '../commands/SETRANGE'; import * as SINTER from '../commands/SINTER'; +import * as SINTERCARD from '../commands/SINTERCARD'; import * as SINTERSTORE from '../commands/SINTERSTORE'; import * as SISMEMBER from '../commands/SISMEMBER'; import * as SMEMBERS from '../commands/SMEMBERS'; import * as SMISMEMBER from '../commands/SMISMEMBER'; import * as SMOVE from '../commands/SMOVE'; +import * as SORT_RO from '../commands/SORT_RO'; +import * as SORT_STORE from '../commands/SORT_STORE'; import * as SORT from '../commands/SORT'; import * as SPOP from '../commands/SPOP'; import * as SRANDMEMBER_COUNT from '../commands/SRANDMEMBER_COUNT'; @@ -149,6 +158,7 @@ import * as ZDIFFSTORE from '../commands/ZDIFFSTORE'; import * as ZINCRBY from '../commands/ZINCRBY'; import * as ZINTER_WITHSCORES from '../commands/ZINTER_WITHSCORES'; import * as ZINTER from '../commands/ZINTER'; +import * as ZINTERCARD from '../commands/ZINTERCARD'; import * as ZINTERSTORE from '../commands/ZINTERSTORE'; import * as ZLEXCOUNT from '../commands/ZLEXCOUNT'; import * as ZMSCORE from '../commands/ZMSCORE'; @@ -222,6 +232,8 @@ export default { expire: EXPIRE, EXPIREAT, expireAt: EXPIREAT, + EXPIRETIME, + expireTime: EXPIRETIME, GEOADD, geoAdd: GEOADD, GEODIST, @@ -324,12 +336,22 @@ export default { mSet: MSET, MSETNX, mSetNX: MSETNX, + OBJECT_ENCODING, + objectEncoding: OBJECT_ENCODING, + OBJECT_FREQ, + objectFreq: OBJECT_FREQ, + OBJECT_IDLETIME, + objectIdleTime: OBJECT_IDLETIME, + OBJECT_REFCOUNT, + objectRefCount: OBJECT_REFCOUNT, PERSIST, persist: PERSIST, PEXPIRE, pExpire: PEXPIRE, PEXPIREAT, pExpireAt: PEXPIREAT, + PEXPIRETIME, + pExpireTime: PEXPIRETIME, PFADD, pfAdd: PFADD, PFCOUNT, @@ -366,6 +388,8 @@ export default { sDiffStore: SDIFFSTORE, SINTER, sInter: SINTER, + SINTERCARD, + sInterCard: SINTERCARD, SINTERSTORE, sInterStore: SINTERSTORE, SET, @@ -386,6 +410,10 @@ export default { smIsMember: SMISMEMBER, SMOVE, sMove: SMOVE, + SORT_RO, + sortRo: SORT_RO, + SORT_STORE, + sortStore: SORT_STORE, SORT, sort: SORT, SPOP, @@ -478,6 +506,8 @@ export default { zInterWithScores: ZINTER_WITHSCORES, ZINTER, zInter: ZINTER, + ZINTERCARD, + zInterCard: ZINTERCARD, ZINTERSTORE, zInterStore: ZINTERSTORE, ZLEXCOUNT, diff --git a/packages/client/lib/commands/ACL_GETUSER.spec.ts b/packages/client/lib/commands/ACL_GETUSER.spec.ts index fcc10768e6..f91f2ff9e5 100644 --- a/packages/client/lib/commands/ACL_GETUSER.spec.ts +++ b/packages/client/lib/commands/ACL_GETUSER.spec.ts @@ -13,20 +13,32 @@ describe('ACL GETUSER', () => { }); testUtils.testWithClient('client.aclGetUser', async client => { + const expectedReply: any = { + passwords: [], + commands: '+@all', + }; + + if (testUtils.isVersionGreaterThan([7])) { + expectedReply.flags = ['on', 'nopass']; + expectedReply.keys = '~*'; + expectedReply.channels = '&*'; + expectedReply.selectors = []; + } else { + expectedReply.keys = ['*']; + expectedReply.selectors = undefined; + + if (testUtils.isVersionGreaterThan([6, 2])) { + expectedReply.flags = ['on', 'allkeys', 'allchannels', 'allcommands', 'nopass']; + expectedReply.channels = ['*']; + } else { + expectedReply.flags = ['on', 'allkeys', 'allcommands', 'nopass']; + expectedReply.channels = undefined; + } + } + assert.deepEqual( await client.aclGetUser('default'), - { - passwords: [], - commands: '+@all', - keys: ['*'], - ...(testUtils.isVersionGreaterThan([6, 2]) ? { - flags: ['on', 'allkeys', 'allchannels', 'allcommands', 'nopass'], - channels: ['*'] - } : { - flags: ['on', 'allkeys', 'allcommands', 'nopass'], - channels: undefined - }) - } + expectedReply ); }, GLOBAL.SERVERS.OPEN); }); diff --git a/packages/client/lib/commands/ACL_GETUSER.ts b/packages/client/lib/commands/ACL_GETUSER.ts index cdb9f3aa78..818a945bac 100644 --- a/packages/client/lib/commands/ACL_GETUSER.ts +++ b/packages/client/lib/commands/ACL_GETUSER.ts @@ -5,24 +5,27 @@ export function transformArguments(username: RedisCommandArgument): RedisCommand } type AclGetUserRawReply = [ - _: RedisCommandArgument, - flags: Array, - _: RedisCommandArgument, - passwords: Array, - _: RedisCommandArgument, - commands: RedisCommandArgument, - _: RedisCommandArgument, - keys: Array, - _: RedisCommandArgument, - channels: Array + 'flags', + Array, + 'passwords', + Array, + 'commands', + RedisCommandArgument, + 'keys', + Array | RedisCommandArgument, + 'channels', + Array | RedisCommandArgument, + 'selectors' | undefined, + Array> | undefined ]; interface AclUser { flags: Array; passwords: Array; commands: RedisCommandArgument; - keys: Array; - channels: Array + keys: Array | RedisCommandArgument; + channels: Array | RedisCommandArgument; + selectors?: Array>; } export function transformReply(reply: AclGetUserRawReply): AclUser { @@ -31,6 +34,7 @@ export function transformReply(reply: AclGetUserRawReply): AclUser { passwords: reply[3], commands: reply[5], keys: reply[7], - channels: reply[9] + channels: reply[9], + selectors: reply[11] }; } diff --git a/packages/client/lib/commands/BITCOUNT.spec.ts b/packages/client/lib/commands/BITCOUNT.spec.ts index 8919957cf9..76e7b03f7c 100644 --- a/packages/client/lib/commands/BITCOUNT.spec.ts +++ b/packages/client/lib/commands/BITCOUNT.spec.ts @@ -11,14 +11,27 @@ describe('BITCOUNT', () => { ); }); - it('with range', () => { - assert.deepEqual( - transformArguments('key', { - start: 0, - end: 1 - }), - ['BITCOUNT', 'key', '0', '1'] - ); + describe('with range', () => { + it('simple', () => { + assert.deepEqual( + transformArguments('key', { + start: 0, + end: 1 + }), + ['BITCOUNT', 'key', '0', '1'] + ); + }); + + it('with mode', () => { + assert.deepEqual( + transformArguments('key', { + start: 0, + end: 1, + mode: 'BIT' + }), + ['BITCOUNT', 'key', '0', '1', 'BIT'] + ); + }); }); }); diff --git a/packages/client/lib/commands/BITCOUNT.ts b/packages/client/lib/commands/BITCOUNT.ts index efbc6f2220..4bbd4f0091 100644 --- a/packages/client/lib/commands/BITCOUNT.ts +++ b/packages/client/lib/commands/BITCOUNT.ts @@ -7,6 +7,7 @@ export const IS_READ_ONLY = true; interface BitCountRange { start: number; end: number; + mode?: 'BYTE' | 'BIT'; } export function transformArguments( @@ -20,6 +21,10 @@ export function transformArguments( range.start.toString(), range.end.toString() ); + + if (range.mode) { + args.push(range.mode); + } } return args; diff --git a/packages/client/lib/commands/BITPOS.spec.ts b/packages/client/lib/commands/BITPOS.spec.ts index 354deea619..2a0758fe5d 100644 --- a/packages/client/lib/commands/BITPOS.spec.ts +++ b/packages/client/lib/commands/BITPOS.spec.ts @@ -18,12 +18,19 @@ describe('BITPOS', () => { ); }); - it('with start, end', () => { + it('with start and end', () => { assert.deepEqual( transformArguments('key', 1, 1, -1), ['BITPOS', 'key', '1', '1', '-1'] ); }); + + it('with start, end and mode', () => { + assert.deepEqual( + transformArguments('key', 1, 1, -1, 'BIT'), + ['BITPOS', 'key', '1', '1', '-1', 'BIT'] + ); + }); }); testUtils.testWithClient('client.bitPos', async client => { diff --git a/packages/client/lib/commands/BITPOS.ts b/packages/client/lib/commands/BITPOS.ts index 2e54b11bc9..a9a035fd9f 100644 --- a/packages/client/lib/commands/BITPOS.ts +++ b/packages/client/lib/commands/BITPOS.ts @@ -9,7 +9,8 @@ export function transformArguments( key: RedisCommandArgument, bit: BitValue, start?: number, - end?: number + end?: number, + mode?: 'BYTE' | 'BIT' ): RedisCommandArguments { const args = ['BITPOS', key, bit.toString()]; @@ -21,6 +22,10 @@ export function transformArguments( args.push(end.toString()); } + if (mode) { + args.push(mode); + } + return args; } diff --git a/packages/client/lib/commands/CLUSTER_ADDSLOTS.ts b/packages/client/lib/commands/CLUSTER_ADDSLOTS.ts index e458b8aab9..6cd357fb82 100644 --- a/packages/client/lib/commands/CLUSTER_ADDSLOTS.ts +++ b/packages/client/lib/commands/CLUSTER_ADDSLOTS.ts @@ -1,13 +1,11 @@ -export function transformArguments(slots: number | Array): Array { - const args = ['CLUSTER', 'ADDSLOTS']; +import { RedisCommandArguments } from '.'; +import { pushVerdictNumberArguments } from './generic-transformers'; - if (typeof slots === 'number') { - args.push(slots.toString()); - } else { - args.push(...slots.map(String)); - } - - return args; +export function transformArguments(slots: number | Array): RedisCommandArguments { + return pushVerdictNumberArguments( + ['CLUSTER', 'ADDSLOTS'], + slots + ); } export declare function transformReply(): string; diff --git a/packages/client/lib/commands/CLUSTER_ADDSLOTSRANGE.spec.ts b/packages/client/lib/commands/CLUSTER_ADDSLOTSRANGE.spec.ts new file mode 100644 index 0000000000..ebd1e3445f --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_ADDSLOTSRANGE.spec.ts @@ -0,0 +1,29 @@ +import { strict as assert } from 'assert'; +import { transformArguments } from './CLUSTER_ADDSLOTSRANGE'; + +describe('CLUSTER ADDSLOTSRANGE', () => { + describe('transformArguments', () => { + it('single', () => { + assert.deepEqual( + transformArguments({ + start: 0, + end: 1 + }), + ['CLUSTER', 'ADDSLOTSRANGE', '0', '1'] + ); + }); + + it('multiple', () => { + assert.deepEqual( + transformArguments([{ + start: 0, + end: 1 + }, { + start: 2, + end: 3 + }]), + ['CLUSTER', 'ADDSLOTSRANGE', '0', '1', '2', '3'] + ); + }); + }); +}); diff --git a/packages/client/lib/commands/CLUSTER_ADDSLOTSRANGE.ts b/packages/client/lib/commands/CLUSTER_ADDSLOTSRANGE.ts new file mode 100644 index 0000000000..6a8d6dc668 --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_ADDSLOTSRANGE.ts @@ -0,0 +1,13 @@ +import { RedisCommandArguments } from '.'; +import { pushSlotRangesArguments, SlotRange } from './generic-transformers'; + +export function transformArguments( + ranges: SlotRange | Array +): RedisCommandArguments { + return pushSlotRangesArguments( + ['CLUSTER', 'ADDSLOTSRANGE'], + ranges + ); +} + +export declare function transformReply(): 'OK'; diff --git a/packages/client/lib/commands/CLUSTER_BUMPEPOCH.spec.ts b/packages/client/lib/commands/CLUSTER_BUMPEPOCH.spec.ts new file mode 100644 index 0000000000..f9d2f5437b --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_BUMPEPOCH.spec.ts @@ -0,0 +1,19 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './CLUSTER_BUMPEPOCH'; + +describe('CLUSTER BUMPEPOCH', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments(), + ['CLUSTER', 'BUMPEPOCH'] + ); + }); + + testUtils.testWithCluster('clusterNode.clusterBumpEpoch', async cluster => { + assert.equal( + typeof await cluster.getSlotMaster(0).client.clusterBumpEpoch(), + 'string' + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/client/lib/commands/CLUSTER_BUMPEPOCH.ts b/packages/client/lib/commands/CLUSTER_BUMPEPOCH.ts new file mode 100644 index 0000000000..7f81c8fdc4 --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_BUMPEPOCH.ts @@ -0,0 +1,5 @@ +export function transformArguments(): Array { + return ['CLUSTER', 'BUMPEPOCH']; +} + +export declare function transformReply(): 'BUMPED' | 'STILL'; diff --git a/packages/client/lib/commands/CLUSTER_COUNT-FAILURE-REPORTS.spec.ts b/packages/client/lib/commands/CLUSTER_COUNT-FAILURE-REPORTS.spec.ts new file mode 100644 index 0000000000..d84687631b --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_COUNT-FAILURE-REPORTS.spec.ts @@ -0,0 +1,22 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './CLUSTER_COUNT-FAILURE-REPORTS'; + +describe('CLUSTER COUNT-FAILURE-REPORTS', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('0'), + ['CLUSTER', 'COUNT-FAILURE-REPORTS', '0'] + ); + }); + + testUtils.testWithCluster('clusterNode.clusterCountFailureReports', async cluster => { + const { client } = cluster.getSlotMaster(0); + assert.equal( + typeof await client.clusterCountFailureReports( + await client.clusterMyId() + ), + 'number' + ); + }, GLOBAL.CLUSTERS.OPEN); +}); diff --git a/packages/client/lib/commands/CLUSTER_COUNT-FAILURE-REPORTS.ts b/packages/client/lib/commands/CLUSTER_COUNT-FAILURE-REPORTS.ts new file mode 100644 index 0000000000..3fbc33052f --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_COUNT-FAILURE-REPORTS.ts @@ -0,0 +1,5 @@ +export function transformArguments(nodeId: string): Array { + return ['CLUSTER', 'COUNT-FAILURE-REPORTS', nodeId]; +} + +export declare function transformReply(): number; diff --git a/packages/client/lib/commands/CLUSTER_COUNTKEYSINSLOT.spec.ts b/packages/client/lib/commands/CLUSTER_COUNTKEYSINSLOT.spec.ts new file mode 100644 index 0000000000..ecaed428cb --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_COUNTKEYSINSLOT.spec.ts @@ -0,0 +1,19 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './CLUSTER_COUNTKEYSINSLOT'; + +describe('CLUSTER COUNTKEYSINSLOT', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments(0), + ['CLUSTER', 'COUNTKEYSINSLOT', '0'] + ); + }); + + testUtils.testWithCluster('clusterNode.clusterCountKeysInSlot', async cluster => { + assert.equal( + typeof await cluster.getSlotMaster(0).client.clusterCountKeysInSlot(0), + 'number' + ); + }, GLOBAL.CLUSTERS.OPEN); +}); diff --git a/packages/client/lib/commands/CLUSTER_COUNTKEYSINSLOT.ts b/packages/client/lib/commands/CLUSTER_COUNTKEYSINSLOT.ts new file mode 100644 index 0000000000..a5ff75e58a --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_COUNTKEYSINSLOT.ts @@ -0,0 +1,5 @@ +export function transformArguments(slot: number): Array { + return ['CLUSTER', 'COUNTKEYSINSLOT', slot.toString()]; +} + +export declare function transformReply(): number; diff --git a/packages/client/lib/commands/CLUSTER_DELSLOTS.spec.ts b/packages/client/lib/commands/CLUSTER_DELSLOTS.spec.ts new file mode 100644 index 0000000000..85d13f4ed3 --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_DELSLOTS.spec.ts @@ -0,0 +1,20 @@ +import { strict as assert } from 'assert'; +import { transformArguments } from './CLUSTER_DELSLOTS'; + +describe('CLUSTER DELSLOTS', () => { + describe('transformArguments', () => { + it('single', () => { + assert.deepEqual( + transformArguments(0), + ['CLUSTER', 'DELSLOTS', '0'] + ); + }); + + it('multiple', () => { + assert.deepEqual( + transformArguments([0, 1]), + ['CLUSTER', 'DELSLOTS', '0', '1'] + ); + }); + }); +}); diff --git a/packages/client/lib/commands/CLUSTER_DELSLOTS.ts b/packages/client/lib/commands/CLUSTER_DELSLOTS.ts new file mode 100644 index 0000000000..bf8d9c1890 --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_DELSLOTS.ts @@ -0,0 +1,11 @@ +import { RedisCommandArguments } from '.'; +import { pushVerdictNumberArguments } from './generic-transformers'; + +export function transformArguments(slots: number | Array): RedisCommandArguments { + return pushVerdictNumberArguments( + ['CLUSTER', 'DELSLOTS'], + slots + ); +} + +export declare function transformReply(): 'OK'; diff --git a/packages/client/lib/commands/CLUSTER_DELSLOTSRANGE.spec.ts b/packages/client/lib/commands/CLUSTER_DELSLOTSRANGE.spec.ts new file mode 100644 index 0000000000..8fd50d01a5 --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_DELSLOTSRANGE.spec.ts @@ -0,0 +1,29 @@ +import { strict as assert } from 'assert'; +import { transformArguments } from './CLUSTER_DELSLOTSRANGE'; + +describe('CLUSTER DELSLOTSRANGE', () => { + describe('transformArguments', () => { + it('single', () => { + assert.deepEqual( + transformArguments({ + start: 0, + end: 1 + }), + ['CLUSTER', 'DELSLOTSRANGE', '0', '1'] + ); + }); + + it('multiple', () => { + assert.deepEqual( + transformArguments([{ + start: 0, + end: 1 + }, { + start: 2, + end: 3 + }]), + ['CLUSTER', 'DELSLOTSRANGE', '0', '1', '2', '3'] + ); + }); + }); +}); diff --git a/packages/client/lib/commands/CLUSTER_DELSLOTSRANGE.ts b/packages/client/lib/commands/CLUSTER_DELSLOTSRANGE.ts new file mode 100644 index 0000000000..b136113c65 --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_DELSLOTSRANGE.ts @@ -0,0 +1,13 @@ +import { RedisCommandArguments } from '.'; +import { pushSlotRangesArguments, SlotRange } from './generic-transformers'; + +export function transformArguments( + ranges: SlotRange | Array +): RedisCommandArguments { + return pushSlotRangesArguments( + ['CLUSTER', 'DELSLOTSRANGE'], + ranges + ); +} + +export declare function transformReply(): 'OK'; diff --git a/packages/client/lib/commands/CLUSTER_FAILOVER.spec.ts b/packages/client/lib/commands/CLUSTER_FAILOVER.spec.ts new file mode 100644 index 0000000000..578ff56b9c --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_FAILOVER.spec.ts @@ -0,0 +1,20 @@ +import { strict as assert } from 'assert'; +import { FailoverModes, transformArguments } from './CLUSTER_FAILOVER'; + +describe('CLUSTER FAILOVER', () => { + describe('transformArguments', () => { + it('simple', () => { + assert.deepEqual( + transformArguments(), + ['CLUSTER', 'FAILOVER'] + ); + }); + + it('with mode', () => { + assert.deepEqual( + transformArguments(FailoverModes.FORCE), + ['CLUSTER', 'FAILOVER', 'FORCE'] + ); + }); + }); +}); diff --git a/packages/client/lib/commands/CLUSTER_FAILOVER.ts b/packages/client/lib/commands/CLUSTER_FAILOVER.ts new file mode 100644 index 0000000000..9bc4b69f34 --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_FAILOVER.ts @@ -0,0 +1,16 @@ +export enum FailoverModes { + FORCE = 'FORCE', + TAKEOVER = 'TAKEOVER' +} + +export function transformArguments(mode?: FailoverModes): Array { + const args = ['CLUSTER', 'FAILOVER']; + + if (mode) { + args.push(mode); + } + + return args; +} + +export declare function transformReply(): 'OK'; diff --git a/packages/client/lib/commands/CLUSTER_FLUSHSLOTS.ts b/packages/client/lib/commands/CLUSTER_FLUSHSLOTS.ts index 285c9fd26f..dfb1e1ccde 100644 --- a/packages/client/lib/commands/CLUSTER_FLUSHSLOTS.ts +++ b/packages/client/lib/commands/CLUSTER_FLUSHSLOTS.ts @@ -2,4 +2,4 @@ export function transformArguments(): Array { return ['CLUSTER', 'FLUSHSLOTS']; } -export declare function transformReply(): string; +export declare function transformReply(): 'OK'; diff --git a/packages/client/lib/commands/CLUSTER_FORGET.spec.ts b/packages/client/lib/commands/CLUSTER_FORGET.spec.ts new file mode 100644 index 0000000000..cadcdb678f --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_FORGET.spec.ts @@ -0,0 +1,11 @@ +import { strict as assert } from 'assert'; +import { transformArguments } from './CLUSTER_FORGET'; + +describe('CLUSTER FORGET', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('0'), + ['CLUSTER', 'FORGET', '0'] + ); + }); +}); diff --git a/packages/client/lib/commands/CLUSTER_FORGET.ts b/packages/client/lib/commands/CLUSTER_FORGET.ts new file mode 100644 index 0000000000..fc557073ae --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_FORGET.ts @@ -0,0 +1,5 @@ +export function transformArguments(nodeId: string): Array { + return ['CLUSTER', 'FORGET', nodeId]; +} + +export declare function transformReply(): 'OK'; diff --git a/packages/client/lib/commands/CLUSTER_GETKEYSINSLOT.spec.ts b/packages/client/lib/commands/CLUSTER_GETKEYSINSLOT.spec.ts index bb20f7521d..7c15634130 100644 --- a/packages/client/lib/commands/CLUSTER_GETKEYSINSLOT.spec.ts +++ b/packages/client/lib/commands/CLUSTER_GETKEYSINSLOT.spec.ts @@ -1,4 +1,5 @@ import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './CLUSTER_GETKEYSINSLOT'; describe('CLUSTER GETKEYSINSLOT', () => { @@ -8,4 +9,12 @@ describe('CLUSTER GETKEYSINSLOT', () => { ['CLUSTER', 'GETKEYSINSLOT', '0', '10'] ); }); + + testUtils.testWithCluster('clusterNode.clusterGetKeysInSlot', async cluster => { + const reply = await cluster.getSlotMaster(0).client.clusterGetKeysInSlot(0, 1); + assert.ok(Array.isArray(reply)); + for (const item of reply) { + assert.equal(typeof item, 'string'); + } + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/packages/client/lib/commands/CLUSTER_GETKEYSINSLOT.ts b/packages/client/lib/commands/CLUSTER_GETKEYSINSLOT.ts index 67c5cbafb7..ec75b7b733 100644 --- a/packages/client/lib/commands/CLUSTER_GETKEYSINSLOT.ts +++ b/packages/client/lib/commands/CLUSTER_GETKEYSINSLOT.ts @@ -2,4 +2,4 @@ export function transformArguments(slot: number, count: number): Array { return ['CLUSTER', 'GETKEYSINSLOT', slot.toString(), count.toString()]; } -export declare function transformReply(): string; +export declare function transformReply(): Array; diff --git a/packages/client/lib/commands/CLUSTER_INFO.spec.ts b/packages/client/lib/commands/CLUSTER_INFO.spec.ts index a4def45cb7..b770ed3361 100644 --- a/packages/client/lib/commands/CLUSTER_INFO.spec.ts +++ b/packages/client/lib/commands/CLUSTER_INFO.spec.ts @@ -1,4 +1,5 @@ import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments, transformReply } from './CLUSTER_INFO'; describe('CLUSTER INFO', () => { @@ -43,4 +44,11 @@ describe('CLUSTER INFO', () => { } ); }); + + testUtils.testWithCluster('clusterNode.clusterInfo', async cluster => { + assert.notEqual( + await cluster.getSlotMaster(0).client.clusterInfo(), + null + ); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/packages/client/lib/commands/CLUSTER_KEYSLOT.spec.ts b/packages/client/lib/commands/CLUSTER_KEYSLOT.spec.ts new file mode 100644 index 0000000000..a7a5ab9472 --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_KEYSLOT.spec.ts @@ -0,0 +1,19 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './CLUSTER_KEYSLOT'; + +describe('CLUSTER KEYSLOT', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('key'), + ['CLUSTER', 'KEYSLOT', 'key'] + ); + }); + + testUtils.testWithCluster('clusterNode.clusterKeySlot', async cluster => { + assert.equal( + typeof await cluster.getSlotMaster(0).client.clusterKeySlot('key'), + 'number' + ); + }, GLOBAL.CLUSTERS.OPEN); +}); diff --git a/packages/client/lib/commands/CLUSTER_KEYSLOT.ts b/packages/client/lib/commands/CLUSTER_KEYSLOT.ts new file mode 100644 index 0000000000..0af524ff12 --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_KEYSLOT.ts @@ -0,0 +1,5 @@ +export function transformArguments(key: string): Array { + return ['CLUSTER', 'KEYSLOT', key]; +} + +export declare function transformReply(): number; diff --git a/packages/client/lib/commands/CLUSTER_LINKS.spec.ts b/packages/client/lib/commands/CLUSTER_LINKS.spec.ts new file mode 100644 index 0000000000..242e9012fb --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_LINKS.spec.ts @@ -0,0 +1,27 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './CLUSTER_LINKS'; + +describe('CLUSTER LINKS', () => { + testUtils.isVersionGreaterThanHook([7, 0]); + + it('transformArguments', () => { + assert.deepEqual( + transformArguments(), + ['CLUSTER', 'LINKS'] + ); + }); + + testUtils.testWithCluster('clusterNode.clusterLinks', async cluster => { + const links = await cluster.getSlotMaster(0).client.clusterLinks(); + assert.ok(Array.isArray(links)); + for (const link of links) { + assert.equal(typeof link.direction, 'string'); + assert.equal(typeof link.node, 'string'); + assert.equal(typeof link.createTime, 'number'); + assert.equal(typeof link.events, 'string'); + assert.equal(typeof link.sendBufferAllocated, 'number'); + assert.equal(typeof link.sendBufferUsed, 'number'); + } + }, GLOBAL.CLUSTERS.OPEN); +}); diff --git a/packages/client/lib/commands/CLUSTER_LINKS.ts b/packages/client/lib/commands/CLUSTER_LINKS.ts new file mode 100644 index 0000000000..9a5608c102 --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_LINKS.ts @@ -0,0 +1,38 @@ +export function transformArguments(): Array { + return ['CLUSTER', 'LINKS']; +} + +type ClusterLinksRawReply = Array<[ + 'direction', + string, + 'node', + string, + 'createTime', + number, + 'events', + string, + 'send-buffer-allocated', + number, + 'send-buffer-used', + number +]>; + +type ClusterLinksReply = Array<{ + direction: string; + node: string; + createTime: number; + events: string; + sendBufferAllocated: number; + sendBufferUsed: number; +}>; + +export function transformReply(reply: ClusterLinksRawReply): ClusterLinksReply { + return reply.map(peerLink => ({ + direction: peerLink[1], + node: peerLink[3], + createTime: Number(peerLink[5]), + events: peerLink[7], + sendBufferAllocated: Number(peerLink[9]), + sendBufferUsed: Number(peerLink[11]) + })); +} diff --git a/packages/client/lib/commands/CLUSTER_MEET.ts b/packages/client/lib/commands/CLUSTER_MEET.ts index 54a0bf708a..e6ce1c1fce 100644 --- a/packages/client/lib/commands/CLUSTER_MEET.ts +++ b/packages/client/lib/commands/CLUSTER_MEET.ts @@ -2,4 +2,4 @@ export function transformArguments(ip: string, port: number): Array { return ['CLUSTER', 'MEET', ip, port.toString()]; } -export declare function transformReply(): string; +export declare function transformReply(): 'OK'; diff --git a/packages/client/lib/commands/CLUSTER_MYID.spec.ts b/packages/client/lib/commands/CLUSTER_MYID.spec.ts new file mode 100644 index 0000000000..7781c37452 --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_MYID.spec.ts @@ -0,0 +1,19 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './CLUSTER_MYID'; + +describe('CLUSTER MYID', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments(), + ['CLUSTER', 'MYID'] + ); + }); + + testUtils.testWithCluster('clusterNode.clusterMyId', async cluster => { + assert.equal( + typeof await cluster.getSlotMaster(0).client.clusterMyId(), + 'string' + ); + }, GLOBAL.CLUSTERS.OPEN); +}); diff --git a/packages/client/lib/commands/CLUSTER_MYID.ts b/packages/client/lib/commands/CLUSTER_MYID.ts new file mode 100644 index 0000000000..2b61684634 --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_MYID.ts @@ -0,0 +1,5 @@ +export function transformArguments(): Array { + return ['CLUSTER', 'MYID']; +} + +export declare function transformReply(): string; diff --git a/packages/client/lib/commands/CLUSTER_REPLICAS.spec.ts b/packages/client/lib/commands/CLUSTER_REPLICAS.spec.ts new file mode 100644 index 0000000000..6c902dc0d8 --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_REPLICAS.spec.ts @@ -0,0 +1,11 @@ +import { strict as assert } from 'assert'; +import { transformArguments } from './CLUSTER_REPLICAS'; + +describe('CLUSTER REPLICAS', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('0'), + ['CLUSTER', 'REPLICAS', '0'] + ); + }); +}); diff --git a/packages/client/lib/commands/CLUSTER_REPLICAS.ts b/packages/client/lib/commands/CLUSTER_REPLICAS.ts new file mode 100644 index 0000000000..a4130125fb --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_REPLICAS.ts @@ -0,0 +1,5 @@ +export function transformArguments(nodeId: string): Array { + return ['CLUSTER', 'REPLICAS', nodeId]; +} + +export { transformReply } from './CLUSTER_NODES'; diff --git a/packages/client/lib/commands/CLUSTER_REPLICATE.spec.ts b/packages/client/lib/commands/CLUSTER_REPLICATE.spec.ts new file mode 100644 index 0000000000..926b7dd0a7 --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_REPLICATE.spec.ts @@ -0,0 +1,11 @@ +import { strict as assert } from 'assert'; +import { transformArguments } from './CLUSTER_REPLICATE'; + +describe('CLUSTER REPLICATE', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('0'), + ['CLUSTER', 'REPLICATE', '0'] + ); + }); +}); diff --git a/packages/client/lib/commands/CLUSTER_REPLICATE.ts b/packages/client/lib/commands/CLUSTER_REPLICATE.ts new file mode 100644 index 0000000000..c74e1ec596 --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_REPLICATE.ts @@ -0,0 +1,5 @@ +export function transformArguments(nodeId: string): Array { + return ['CLUSTER', 'REPLICATE', nodeId]; +} + +export declare function transformReply(): 'OK'; diff --git a/packages/client/lib/commands/CLUSTER_RESET.spec.ts b/packages/client/lib/commands/CLUSTER_RESET.spec.ts index c077e7f887..340da7457c 100644 --- a/packages/client/lib/commands/CLUSTER_RESET.spec.ts +++ b/packages/client/lib/commands/CLUSTER_RESET.spec.ts @@ -10,18 +10,11 @@ describe('CLUSTER RESET', () => { ); }); - it('HARD', () => { + it('with mode', () => { assert.deepEqual( transformArguments('HARD'), ['CLUSTER', 'RESET', 'HARD'] ); }); - - it('SOFT', () => { - assert.deepEqual( - transformArguments('SOFT'), - ['CLUSTER', 'RESET', 'SOFT'] - ); - }); }); }); diff --git a/packages/client/lib/commands/CLUSTER_RESET.ts b/packages/client/lib/commands/CLUSTER_RESET.ts index 3e7c5bb52f..c6901e045d 100644 --- a/packages/client/lib/commands/CLUSTER_RESET.ts +++ b/packages/client/lib/commands/CLUSTER_RESET.ts @@ -1,6 +1,4 @@ -export type ClusterResetModes = 'HARD' | 'SOFT'; - -export function transformArguments(mode?: ClusterResetModes): Array { +export function transformArguments(mode?: 'HARD' | 'SOFT'): Array { const args = ['CLUSTER', 'RESET']; if (mode) { diff --git a/packages/client/lib/commands/CLUSTER_SAVECONFIG.spec.ts b/packages/client/lib/commands/CLUSTER_SAVECONFIG.spec.ts new file mode 100644 index 0000000000..bcdccd9091 --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_SAVECONFIG.spec.ts @@ -0,0 +1,19 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './CLUSTER_SAVECONFIG'; + +describe('CLUSTER SAVECONFIG', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments(), + ['CLUSTER', 'SAVECONFIG'] + ); + }); + + testUtils.testWithCluster('clusterNode.clusterSaveConfig', async cluster => { + assert.equal( + await cluster.getSlotMaster(0).client.clusterSaveConfig(), + 'OK' + ); + }, GLOBAL.CLUSTERS.OPEN); +}); diff --git a/packages/client/lib/commands/CLUSTER_SAVECONFIG.ts b/packages/client/lib/commands/CLUSTER_SAVECONFIG.ts new file mode 100644 index 0000000000..7e7fb181cc --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_SAVECONFIG.ts @@ -0,0 +1,5 @@ +export function transformArguments(): Array { + return ['CLUSTER', 'SAVECONFIG']; +} + +export declare function transformReply(): 'OK'; diff --git a/packages/client/lib/commands/CLUSTER_SET-CONFIG-EPOCH.spec.ts b/packages/client/lib/commands/CLUSTER_SET-CONFIG-EPOCH.spec.ts new file mode 100644 index 0000000000..dd24157416 --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_SET-CONFIG-EPOCH.spec.ts @@ -0,0 +1,11 @@ +import { strict as assert } from 'assert'; +import { transformArguments } from './CLUSTER_SET-CONFIG-EPOCH'; + +describe('CLUSTER SET-CONFIG-EPOCH', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments(0), + ['CLUSTER', 'SET-CONFIG-EPOCH', '0'] + ); + }); +}); diff --git a/packages/client/lib/commands/CLUSTER_SET-CONFIG-EPOCH.ts b/packages/client/lib/commands/CLUSTER_SET-CONFIG-EPOCH.ts new file mode 100644 index 0000000000..c50a6b9d3a --- /dev/null +++ b/packages/client/lib/commands/CLUSTER_SET-CONFIG-EPOCH.ts @@ -0,0 +1,5 @@ +export function transformArguments(configEpoch: number): Array { + return ['CLUSTER', 'SET-CONFIG-EPOCH', configEpoch.toString()]; +} + +export declare function transformReply(): 'OK'; diff --git a/packages/client/lib/commands/CLUSTER_SETSLOT.ts b/packages/client/lib/commands/CLUSTER_SETSLOT.ts index 591b5fb963..c01505c71a 100644 --- a/packages/client/lib/commands/CLUSTER_SETSLOT.ts +++ b/packages/client/lib/commands/CLUSTER_SETSLOT.ts @@ -5,7 +5,11 @@ export enum ClusterSlotStates { NODE = 'NODE' } -export function transformArguments(slot: number, state: ClusterSlotStates, nodeId?: string): Array { +export function transformArguments( + slot: number, + state: ClusterSlotStates, + nodeId?: string +): Array { const args = ['CLUSTER', 'SETSLOT', slot.toString(), state]; if (nodeId) { @@ -15,4 +19,4 @@ export function transformArguments(slot: number, state: ClusterSlotStates, nodeI return args; } -export declare function transformReply(): string; +export declare function transformReply(): 'OK'; diff --git a/packages/client/lib/commands/CLUSTER_SLOTS.ts b/packages/client/lib/commands/CLUSTER_SLOTS.ts index afe1ebc83d..7e1f5dcc96 100644 --- a/packages/client/lib/commands/CLUSTER_SLOTS.ts +++ b/packages/client/lib/commands/CLUSTER_SLOTS.ts @@ -6,7 +6,12 @@ export function transformArguments(): RedisCommandArguments { type ClusterSlotsRawNode = [ip: string, port: number, id: string]; -type ClusterSlotsRawReply = Array<[from: number, to: number, master: ClusterSlotsRawNode, ...replicas: Array]>; +type ClusterSlotsRawReply = Array<[ + from: number, + to: number, + master: ClusterSlotsRawNode, + ...replicas: Array +]>; type ClusterSlotsNode = { ip: string; diff --git a/packages/client/lib/commands/COMMAND_GETKEYSANDFLAGS.spec.ts b/packages/client/lib/commands/COMMAND_GETKEYSANDFLAGS.spec.ts new file mode 100644 index 0000000000..19bc27d5f9 --- /dev/null +++ b/packages/client/lib/commands/COMMAND_GETKEYSANDFLAGS.spec.ts @@ -0,0 +1,24 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './COMMAND_GETKEYSANDFLAGS'; + +describe('COMMAND GETKEYSANDFLAGS', () => { + testUtils.isVersionGreaterThanHook([7, 0]); + + it('transformArguments', () => { + assert.deepEqual( + transformArguments(['GET', 'key']), + ['COMMAND', 'GETKEYSANDFLAGS', 'GET', 'key'] + ); + }); + + testUtils.testWithClient('client.commandGetKeysAndFlags', async client => { + assert.deepEqual( + await client.commandGetKeysAndFlags(['GET', 'key']), + [{ + key: 'key', + flags: ['RO', 'access'] + }] + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/client/lib/commands/COMMAND_GETKEYSANDFLAGS.ts b/packages/client/lib/commands/COMMAND_GETKEYSANDFLAGS.ts new file mode 100644 index 0000000000..96b28186cc --- /dev/null +++ b/packages/client/lib/commands/COMMAND_GETKEYSANDFLAGS.ts @@ -0,0 +1,24 @@ +import { RedisCommandArgument, RedisCommandArguments } from '.'; + +export const IS_READ_ONLY = true; + +export function transformArguments(args: Array): RedisCommandArguments { + return ['COMMAND', 'GETKEYSANDFLAGS', ...args]; +} + +type KeysAndFlagsRawReply = Array<[ + RedisCommandArgument, + RedisCommandArguments +]>; + +type KeysAndFlagsReply = Array<{ + key: RedisCommandArgument; + flags: RedisCommandArguments; +}>; + +export function transformReply(reply: KeysAndFlagsRawReply): KeysAndFlagsReply { + return reply.map(([key, flags]) => ({ + key, + flags + })); +} diff --git a/packages/client/lib/commands/COMMAND_INFO.spec.ts b/packages/client/lib/commands/COMMAND_INFO.spec.ts index d648846048..c54a5d0aeb 100644 --- a/packages/client/lib/commands/COMMAND_INFO.spec.ts +++ b/packages/client/lib/commands/COMMAND_INFO.spec.ts @@ -9,7 +9,11 @@ export function assertPingCommand(commandInfo: CommandReply | null | undefined): { name: 'ping', arity: -1, - flags: new Set([CommandFlags.STALE, CommandFlags.FAST]), + flags: new Set( + testUtils.isVersionGreaterThan([7]) ? + [CommandFlags.FAST] : + [CommandFlags.STALE, CommandFlags.FAST] + ), firstKeyIndex: 0, lastKeyIndex: 0, step: 0, diff --git a/packages/client/lib/commands/CONFIG_SET.spec.ts b/packages/client/lib/commands/CONFIG_SET.spec.ts index 3127e9732b..93a7a6ff25 100644 --- a/packages/client/lib/commands/CONFIG_SET.spec.ts +++ b/packages/client/lib/commands/CONFIG_SET.spec.ts @@ -2,10 +2,23 @@ import { strict as assert } from 'assert'; import { transformArguments } from './CONFIG_SET'; describe('CONFIG SET', () => { - it('transformArguments', () => { - assert.deepEqual( - transformArguments('parameter', 'value'), - ['CONFIG', 'SET', 'parameter', 'value'] - ); + describe('transformArguments', () => { + it('set one parameter (old version)', () => { + assert.deepEqual( + transformArguments('parameter', 'value'), + ['CONFIG', 'SET', 'parameter', 'value'] + ); + }); + + it('set muiltiple parameters', () => { + assert.deepEqual( + transformArguments({ + 1: 'a', + 2: 'b', + 3: 'c' + }), + ['CONFIG', 'SET', '1', 'a', '2', 'b', '3', 'c'] + ); + }); }); }); diff --git a/packages/client/lib/commands/CONFIG_SET.ts b/packages/client/lib/commands/CONFIG_SET.ts index ec09e4469f..41f40d035d 100644 --- a/packages/client/lib/commands/CONFIG_SET.ts +++ b/packages/client/lib/commands/CONFIG_SET.ts @@ -1,5 +1,23 @@ -export function transformArguments(parameter: string, value: string): Array { - return ['CONFIG', 'SET', parameter, value]; +import { RedisCommandArgument, RedisCommandArguments } from '.'; + +type SingleParameter = [parameter: RedisCommandArgument, value: RedisCommandArgument]; + +type MultipleParameters = [config: Record]; + +export function transformArguments( + ...[parameterOrConfig, value]: SingleParameter | MultipleParameters +): RedisCommandArguments { + const args: RedisCommandArguments = ['CONFIG', 'SET']; + + if (typeof parameterOrConfig === 'string') { + args.push(parameterOrConfig, value!); + } else { + for (const [key, value] of Object.entries(parameterOrConfig)) { + args.push(key, value); + } + } + + return args; } export declare function transformReply(): string; diff --git a/packages/client/lib/commands/EXPIRE.spec.ts b/packages/client/lib/commands/EXPIRE.spec.ts index e2dc6e0312..39f9d70bd9 100644 --- a/packages/client/lib/commands/EXPIRE.spec.ts +++ b/packages/client/lib/commands/EXPIRE.spec.ts @@ -3,11 +3,20 @@ import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './EXPIRE'; describe('EXPIRE', () => { - it('transformArguments', () => { - assert.deepEqual( - transformArguments('key', 1), - ['EXPIRE', 'key', '1'] - ); + describe('transformArguments', () => { + it('simple', () => { + assert.deepEqual( + transformArguments('key', 1), + ['EXPIRE', 'key', '1'] + ); + }); + + it('with set option', () => { + assert.deepEqual( + transformArguments('key', 1, 'NX'), + ['EXPIRE', 'key', '1', 'NX'] + ); + }); }); testUtils.testWithClient('client.expire', async client => { diff --git a/packages/client/lib/commands/EXPIRE.ts b/packages/client/lib/commands/EXPIRE.ts index 291b544c6a..d9e85595c3 100644 --- a/packages/client/lib/commands/EXPIRE.ts +++ b/packages/client/lib/commands/EXPIRE.ts @@ -4,9 +4,16 @@ export const FIRST_KEY_INDEX = 1; export function transformArguments( key: RedisCommandArgument, - seconds: number + seconds: number, + mode?: 'NX' | 'XX' | 'GT' | 'LT' ): RedisCommandArguments { - return ['EXPIRE', key, seconds.toString()]; + const args = ['EXPIRE', key, seconds.toString()]; + + if (mode) { + args.push(mode); + } + + return args; } export { transformBooleanReply as transformReply } from './generic-transformers'; diff --git a/packages/client/lib/commands/EXPIREAT.spec.ts b/packages/client/lib/commands/EXPIREAT.spec.ts index 1a11af1a73..0335b36f5f 100644 --- a/packages/client/lib/commands/EXPIREAT.spec.ts +++ b/packages/client/lib/commands/EXPIREAT.spec.ts @@ -18,6 +18,13 @@ describe('EXPIREAT', () => { ['EXPIREAT', 'key', Math.floor(d.getTime() / 1000).toString()] ); }); + + it('with set option', () => { + assert.deepEqual( + transformArguments('key', 1, 'GT'), + ['EXPIREAT', 'key', '1', 'GT'] + ); + }); }); testUtils.testWithClient('client.expireAt', async client => { diff --git a/packages/client/lib/commands/EXPIREAT.ts b/packages/client/lib/commands/EXPIREAT.ts index 3ddb75fe18..84e7760fe7 100644 --- a/packages/client/lib/commands/EXPIREAT.ts +++ b/packages/client/lib/commands/EXPIREAT.ts @@ -5,13 +5,20 @@ export const FIRST_KEY_INDEX = 1; export function transformArguments( key: RedisCommandArgument, - timestamp: number | Date + timestamp: number | Date, + mode?: 'NX' | 'XX' | 'GT' | 'LT' ): RedisCommandArguments { - return [ + const args = [ 'EXPIREAT', key, transformEXAT(timestamp) ]; + + if (mode) { + args.push(mode); + } + + return args; } export { transformBooleanReply as transformReply } from './generic-transformers'; diff --git a/packages/client/lib/commands/EXPIRETIME.spec.ts b/packages/client/lib/commands/EXPIRETIME.spec.ts new file mode 100644 index 0000000000..3f33693d89 --- /dev/null +++ b/packages/client/lib/commands/EXPIRETIME.spec.ts @@ -0,0 +1,21 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './EXPIRETIME'; + +describe('EXPIRETIME', () => { + testUtils.isVersionGreaterThanHook([7, 0]); + + it('transformArguments', () => { + assert.deepEqual( + transformArguments('key'), + ['EXPIRETIME', 'key'] + ); + }); + + testUtils.testWithClient('client.expireTime', async client => { + assert.equal( + await client.expireTime('key'), + -2 + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/client/lib/commands/EXPIRETIME.ts b/packages/client/lib/commands/EXPIRETIME.ts new file mode 100644 index 0000000000..8c1bb07599 --- /dev/null +++ b/packages/client/lib/commands/EXPIRETIME.ts @@ -0,0 +1,9 @@ +import { RedisCommandArgument, RedisCommandArguments } from '.'; + +export const FIRST_KEY_INDEX = 1; + +export function transformArguments(key: RedisCommandArgument): RedisCommandArguments { + return ['EXPIRETIME', key]; +} + +export declare function transformReply(): number; diff --git a/packages/client/lib/commands/LATENCY_DOCTOR.spec.ts b/packages/client/lib/commands/LATENCY_DOCTOR.spec.ts new file mode 100644 index 0000000000..3888ff8bd3 --- /dev/null +++ b/packages/client/lib/commands/LATENCY_DOCTOR.spec.ts @@ -0,0 +1,19 @@ +import {strict as assert} from 'assert'; +import testUtils, {GLOBAL} from '../test-utils'; +import { transformArguments } from './LATENCY_DOCTOR'; + +describe('LATENCY DOCTOR', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments(), + ['LATENCY', 'DOCTOR'] + ); + }); + + testUtils.testWithClient('client.latencyDoctor', async client => { + assert.equal( + typeof (await client.latencyDoctor()), + 'string' + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/client/lib/commands/LATENCY_DOCTOR.ts b/packages/client/lib/commands/LATENCY_DOCTOR.ts new file mode 100644 index 0000000000..d2106c0611 --- /dev/null +++ b/packages/client/lib/commands/LATENCY_DOCTOR.ts @@ -0,0 +1,5 @@ +export function transformArguments(): Array { + return ['LATENCY', 'DOCTOR']; +} + +export declare function transformReply(): string; diff --git a/packages/client/lib/commands/OBJECT_ENCODING.spec.ts b/packages/client/lib/commands/OBJECT_ENCODING.spec.ts new file mode 100644 index 0000000000..6f42969d54 --- /dev/null +++ b/packages/client/lib/commands/OBJECT_ENCODING.spec.ts @@ -0,0 +1,19 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './OBJECT_ENCODING'; + +describe('OBJECT ENCODING', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('key'), + ['OBJECT', 'ENCODING', 'key'] + ); + }); + + testUtils.testWithClient('client.objectEncoding', async client => { + assert.equal( + await client.objectEncoding('key'), + null + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/client/lib/commands/OBJECT_ENCODING.ts b/packages/client/lib/commands/OBJECT_ENCODING.ts new file mode 100644 index 0000000000..ac219ae89e --- /dev/null +++ b/packages/client/lib/commands/OBJECT_ENCODING.ts @@ -0,0 +1,11 @@ +import { RedisCommandArgument, RedisCommandArguments } from '.'; + +export const FIRST_KEY_INDEX = 2; + +export const IS_READ_ONLY = true; + +export function transformArguments(key: RedisCommandArgument): RedisCommandArguments { + return ['OBJECT', 'ENCODING', key]; +} + +export declare function transformReply(): string | null; diff --git a/packages/client/lib/commands/OBJECT_FREQ.spec.ts b/packages/client/lib/commands/OBJECT_FREQ.spec.ts new file mode 100644 index 0000000000..6d2513cf18 --- /dev/null +++ b/packages/client/lib/commands/OBJECT_FREQ.spec.ts @@ -0,0 +1,19 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './OBJECT_FREQ'; + +describe('OBJECT FREQ', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('key'), + ['OBJECT', 'FREQ', 'key'] + ); + }); + + testUtils.testWithClient('client.objectFreq', async client => { + assert.equal( + await client.objectFreq('key'), + null + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/client/lib/commands/OBJECT_FREQ.ts b/packages/client/lib/commands/OBJECT_FREQ.ts new file mode 100644 index 0000000000..071d16f274 --- /dev/null +++ b/packages/client/lib/commands/OBJECT_FREQ.ts @@ -0,0 +1,11 @@ +import { RedisCommandArgument, RedisCommandArguments } from '.'; + +export const FIRST_KEY_INDEX = 2; + +export const IS_READ_ONLY = true; + +export function transformArguments(key: RedisCommandArgument): RedisCommandArguments { + return ['OBJECT', 'FREQ', key]; +} + +export declare function transformReply(): number | null; diff --git a/packages/client/lib/commands/OBJECT_IDLETIME.spec.ts b/packages/client/lib/commands/OBJECT_IDLETIME.spec.ts new file mode 100644 index 0000000000..61529e1366 --- /dev/null +++ b/packages/client/lib/commands/OBJECT_IDLETIME.spec.ts @@ -0,0 +1,19 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './OBJECT_IDLETIME'; + +describe('OBJECT IDLETIME', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('key'), + ['OBJECT', 'IDLETIME', 'key'] + ); + }); + + testUtils.testWithClient('client.objectIdleTime', async client => { + assert.equal( + await client.objectIdleTime('key'), + null + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/client/lib/commands/OBJECT_IDLETIME.ts b/packages/client/lib/commands/OBJECT_IDLETIME.ts new file mode 100644 index 0000000000..38847d6f4c --- /dev/null +++ b/packages/client/lib/commands/OBJECT_IDLETIME.ts @@ -0,0 +1,11 @@ +import { RedisCommandArgument, RedisCommandArguments } from '.'; + +export const FIRST_KEY_INDEX = 2; + +export const IS_READ_ONLY = true; + +export function transformArguments(key: RedisCommandArgument): RedisCommandArguments { + return ['OBJECT', 'IDLETIME', key]; +} + +export declare function transformReply(): number | null; diff --git a/packages/client/lib/commands/OBJECT_REFCOUNT.spec.ts b/packages/client/lib/commands/OBJECT_REFCOUNT.spec.ts new file mode 100644 index 0000000000..199dca3fe8 --- /dev/null +++ b/packages/client/lib/commands/OBJECT_REFCOUNT.spec.ts @@ -0,0 +1,19 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './OBJECT_REFCOUNT'; + +describe('OBJECT REFCOUNT', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('key'), + ['OBJECT', 'REFCOUNT', 'key'] + ); + }); + + testUtils.testWithClient('client.objectRefCount', async client => { + assert.equal( + await client.objectRefCount('key'), + null + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/client/lib/commands/OBJECT_REFCOUNT.ts b/packages/client/lib/commands/OBJECT_REFCOUNT.ts new file mode 100644 index 0000000000..9fd259b5b9 --- /dev/null +++ b/packages/client/lib/commands/OBJECT_REFCOUNT.ts @@ -0,0 +1,11 @@ +import { RedisCommandArgument, RedisCommandArguments } from '.'; + +export const FIRST_KEY_INDEX = 2; + +export const IS_READ_ONLY = true; + +export function transformArguments(key: RedisCommandArgument): RedisCommandArguments { + return ['OBJECT', 'REFCOUNT', key]; +} + +export declare function transformReply(): number | null; diff --git a/packages/client/lib/commands/PEXPIRE.spec.ts b/packages/client/lib/commands/PEXPIRE.spec.ts index 4738edcf8f..03bde65610 100644 --- a/packages/client/lib/commands/PEXPIRE.spec.ts +++ b/packages/client/lib/commands/PEXPIRE.spec.ts @@ -3,11 +3,20 @@ import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './PEXPIRE'; describe('PEXPIRE', () => { - it('transformArguments', () => { - assert.deepEqual( - transformArguments('key', 1), - ['PEXPIRE', 'key', '1'] - ); + describe('transformArguments', () => { + it('simple', () => { + assert.deepEqual( + transformArguments('key', 1), + ['PEXPIRE', 'key', '1'] + ); + }); + + it('with set option', () => { + assert.deepEqual( + transformArguments('key', 1, 'GT'), + ['PEXPIRE', 'key', '1', 'GT'] + ); + }); }); testUtils.testWithClient('client.pExpire', async client => { diff --git a/packages/client/lib/commands/PEXPIRE.ts b/packages/client/lib/commands/PEXPIRE.ts index 428bfd9d26..cbb5666a51 100644 --- a/packages/client/lib/commands/PEXPIRE.ts +++ b/packages/client/lib/commands/PEXPIRE.ts @@ -4,9 +4,16 @@ export const FIRST_KEY_INDEX = 1; export function transformArguments( key: RedisCommandArgument, - milliseconds: number + milliseconds: number, + mode?: 'NX' | 'XX' | 'GT' | 'LT' ): RedisCommandArguments { - return ['PEXPIRE', key, milliseconds.toString()]; + const args = ['PEXPIRE', key, milliseconds.toString()]; + + if (mode) { + args.push(mode); + } + + return args; } export { transformBooleanReply as transformReply } from './generic-transformers'; diff --git a/packages/client/lib/commands/PEXPIREAT.spec.ts b/packages/client/lib/commands/PEXPIREAT.spec.ts index 19fc3b888d..fec03c8fb7 100644 --- a/packages/client/lib/commands/PEXPIREAT.spec.ts +++ b/packages/client/lib/commands/PEXPIREAT.spec.ts @@ -18,6 +18,13 @@ describe('PEXPIREAT', () => { ['PEXPIREAT', 'key', d.getTime().toString()] ); }); + + it('with set option', () => { + assert.deepEqual( + transformArguments('key', 1, 'XX'), + ['PEXPIREAT', 'key', '1', 'XX'] + ); + }); }); testUtils.testWithClient('client.pExpireAt', async client => { diff --git a/packages/client/lib/commands/PEXPIREAT.ts b/packages/client/lib/commands/PEXPIREAT.ts index 49872877f6..da912ec4fc 100644 --- a/packages/client/lib/commands/PEXPIREAT.ts +++ b/packages/client/lib/commands/PEXPIREAT.ts @@ -5,13 +5,20 @@ export const FIRST_KEY_INDEX = 1; export function transformArguments( key: RedisCommandArgument, - millisecondsTimestamp: number | Date + millisecondsTimestamp: number | Date, + mode?: 'NX' | 'XX' | 'GT' | 'LT' ): RedisCommandArguments { - return [ + const args = [ 'PEXPIREAT', key, transformPXAT(millisecondsTimestamp) ]; + + if (mode) { + args.push(mode); + } + + return args; } export { transformBooleanReply as transformReply } from './generic-transformers'; diff --git a/packages/client/lib/commands/PEXPIRETIME.spec.ts b/packages/client/lib/commands/PEXPIRETIME.spec.ts new file mode 100644 index 0000000000..8874346296 --- /dev/null +++ b/packages/client/lib/commands/PEXPIRETIME.spec.ts @@ -0,0 +1,21 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './PEXPIRETIME'; + +describe('PEXPIRETIME', () => { + testUtils.isVersionGreaterThanHook([7, 0]); + + it('transformArguments', () => { + assert.deepEqual( + transformArguments('key'), + ['PEXPIRETIME', 'key'] + ); + }); + + testUtils.testWithClient('client.pExpireTime', async client => { + assert.equal( + await client.pExpireTime('key'), + -2 + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/client/lib/commands/PEXPIRETIME.ts b/packages/client/lib/commands/PEXPIRETIME.ts new file mode 100644 index 0000000000..4c1acba8f0 --- /dev/null +++ b/packages/client/lib/commands/PEXPIRETIME.ts @@ -0,0 +1,9 @@ +import { RedisCommandArgument, RedisCommandArguments } from '.'; + +export const FIRST_KEY_INDEX = 1; + +export function transformArguments(key: RedisCommandArgument): RedisCommandArguments { + return ['PEXPIRETIME', key]; +} + +export declare function transformReply(): number; diff --git a/packages/client/lib/commands/SINTERCARD.spec.ts b/packages/client/lib/commands/SINTERCARD.spec.ts new file mode 100644 index 0000000000..24bd6cb808 --- /dev/null +++ b/packages/client/lib/commands/SINTERCARD.spec.ts @@ -0,0 +1,30 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './SINTERCARD'; + +describe('SINTERCARD', () => { + testUtils.isVersionGreaterThanHook([7, 0]); + + describe('transformArguments', () => { + it('simple', () => { + assert.deepEqual( + transformArguments(['1', '2']), + ['SINTERCARD', '2', '1', '2'] + ); + }); + + it('with limit', () => { + assert.deepEqual( + transformArguments(['1', '2'], 1), + ['SINTERCARD', '2', '1', '2', 'LIMIT', '1'] + ); + }); + }); + + testUtils.testWithClient('client.sInterCard', async client => { + assert.deepEqual( + await client.sInterCard('key'), + 0 + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/client/lib/commands/SINTERCARD.ts b/packages/client/lib/commands/SINTERCARD.ts new file mode 100644 index 0000000000..ddb7e5b00e --- /dev/null +++ b/packages/client/lib/commands/SINTERCARD.ts @@ -0,0 +1,21 @@ +import { RedisCommandArgument, RedisCommandArguments } from '.'; +import { pushVerdictArgument } from './generic-transformers'; + +export const FIRST_KEY_INDEX = 2; + +export const IS_READ_ONLY = true; + +export function transformArguments( + keys: Array | RedisCommandArgument, + limit?: number +): RedisCommandArguments { + const args = pushVerdictArgument(['SINTERCARD'], keys); + + if (limit) { + args.push('LIMIT', limit.toString()); + } + + return args; +} + +export declare function transformReply(): number; diff --git a/packages/client/lib/commands/SORT.spec.ts b/packages/client/lib/commands/SORT.spec.ts index 637f48876d..4967b020ad 100644 --- a/packages/client/lib/commands/SORT.spec.ts +++ b/packages/client/lib/commands/SORT.spec.ts @@ -70,16 +70,7 @@ describe('SORT', () => { ); }); - it('with STORE', () => { - assert.deepEqual( - transformArguments('key', { - STORE: 'destination' - }), - ['SORT', 'key', 'STORE', 'destination'] - ); - }); - - it('with BY, LIMIT, GET, DIRECTION, ALPHA, STORE', () => { + it('with BY, LIMIT, GET, DIRECTION, ALPHA', () => { assert.deepEqual( transformArguments('key', { BY: 'pattern', @@ -89,10 +80,9 @@ describe('SORT', () => { }, GET: 'pattern', DIRECTION: 'ASC', - ALPHA: true, - STORE: 'destination' + ALPHA: true }), - ['SORT', 'key', 'BY', 'pattern', 'LIMIT', '0', '1', 'GET', 'pattern', 'ASC', 'ALPHA', 'STORE', 'destination'] + ['SORT', 'key', 'BY', 'pattern', 'LIMIT', '0', '1', 'GET', 'pattern', 'ASC', 'ALPHA'] ); }); }); diff --git a/packages/client/lib/commands/SORT.ts b/packages/client/lib/commands/SORT.ts index dfa38dc756..15e95bde67 100644 --- a/packages/client/lib/commands/SORT.ts +++ b/packages/client/lib/commands/SORT.ts @@ -1,56 +1,13 @@ +import { RedisCommandArguments } from '.'; +import { pushSortArguments, SortOptions } from './generic-transformers'; + export const FIRST_KEY_INDEX = 1; -export const IS_READ_ONLY = true; - -interface SortOptions { - BY?: string; - LIMIT?: { - offset: number; - count: number; - }, - GET?: string | Array; - DIRECTION?: 'ASC' | 'DESC'; - ALPHA?: true; - STORE?: string; +export function transformArguments( + key: string, + options?: SortOptions +): RedisCommandArguments { + return pushSortArguments(['SORT', key], options); } -export function transformArguments(key: string, options?: SortOptions): Array { - const args = ['SORT', key]; - - if (options?.BY) { - args.push('BY', options.BY); - } - - if (options?.LIMIT) { - args.push( - 'LIMIT', - options.LIMIT.offset.toString(), - options.LIMIT.count.toString() - ); - } - - if (options?.GET) { - for (const pattern of (typeof options.GET === 'string' ? [options.GET] : options.GET)) { - args.push('GET', pattern); - } - } - - if (options?.DIRECTION) { - args.push(options.DIRECTION); - } - - if (options?.ALPHA) { - args.push('ALPHA'); - } - - if (options?.STORE) { - args.push('STORE', options.STORE); - } - - return args; -} - -// integer when using `STORE` -export function transformReply(reply: Array | number): Array | number { - return reply; -} +export declare function transformReply(): Array; diff --git a/packages/client/lib/commands/SORT_RO.spec.ts b/packages/client/lib/commands/SORT_RO.spec.ts new file mode 100644 index 0000000000..0cc57991b7 --- /dev/null +++ b/packages/client/lib/commands/SORT_RO.spec.ts @@ -0,0 +1,98 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './SORT_RO'; + +describe('SORT_RO', () => { + testUtils.isVersionGreaterThanHook([7, 0]); + + describe('transformArguments', () => { + it('simple', () => { + assert.deepEqual( + transformArguments('key'), + ['SORT_RO', 'key'] + ); + }); + + it('with BY', () => { + assert.deepEqual( + transformArguments('key', { + BY: 'pattern' + }), + ['SORT_RO', 'key', 'BY', 'pattern'] + ); + }); + + it('with LIMIT', () => { + assert.deepEqual( + transformArguments('key', { + LIMIT: { + offset: 0, + count: 1 + } + }), + ['SORT_RO', 'key', 'LIMIT', '0', '1'] + ); + }); + + describe('with GET', () => { + it('string', () => { + assert.deepEqual( + transformArguments('key', { + GET: 'pattern' + }), + ['SORT_RO', 'key', 'GET', 'pattern'] + ); + }); + + it('array', () => { + assert.deepEqual( + transformArguments('key', { + GET: ['1', '2'] + }), + ['SORT_RO', 'key', 'GET', '1', 'GET', '2'] + ); + }); + }); + + it('with DIRECTION', () => { + assert.deepEqual( + transformArguments('key', { + DIRECTION: 'ASC' + }), + ['SORT_RO', 'key', 'ASC'] + ); + }); + + it('with ALPHA', () => { + assert.deepEqual( + transformArguments('key', { + ALPHA: true + }), + ['SORT_RO', 'key', 'ALPHA'] + ); + }); + + it('with BY, LIMIT, GET, DIRECTION, ALPHA', () => { + assert.deepEqual( + transformArguments('key', { + BY: 'pattern', + LIMIT: { + offset: 0, + count: 1 + }, + GET: 'pattern', + DIRECTION: 'ASC', + ALPHA: true, + }), + ['SORT_RO', 'key', 'BY', 'pattern', 'LIMIT', '0', '1', 'GET', 'pattern', 'ASC', 'ALPHA'] + ); + }); + }); + + testUtils.testWithClient('client.sortRo', async client => { + assert.deepEqual( + await client.sortRo('key'), + [] + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/client/lib/commands/SORT_RO.ts b/packages/client/lib/commands/SORT_RO.ts new file mode 100644 index 0000000000..4af7acd80d --- /dev/null +++ b/packages/client/lib/commands/SORT_RO.ts @@ -0,0 +1,15 @@ +import { RedisCommandArguments } from '.'; +import { pushSortArguments, SortOptions } from "./generic-transformers"; + +export const FIRST_KEY_INDEX = 1; + +export const IS_READ_ONLY = true; + +export function transformArguments( + key: string, + options?: SortOptions +): RedisCommandArguments { + return pushSortArguments(['SORT_RO', key], options); +} + +export declare function transformReply(): Array; diff --git a/packages/client/lib/commands/SORT_STORE.spec.ts b/packages/client/lib/commands/SORT_STORE.spec.ts new file mode 100644 index 0000000000..d078135255 --- /dev/null +++ b/packages/client/lib/commands/SORT_STORE.spec.ts @@ -0,0 +1,96 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './SORT_STORE'; + +describe('SORT STORE', () => { + describe('transformArguments', () => { + it('simple', () => { + assert.deepEqual( + transformArguments('source', 'destination'), + ['SORT', 'source', 'STORE', 'destination'] + ); + }); + + it('with BY', () => { + assert.deepEqual( + transformArguments('source', 'destination', { + BY: 'pattern' + }), + ['SORT', 'source', 'BY', 'pattern', 'STORE', 'destination'] + ); + }); + + it('with LIMIT', () => { + assert.deepEqual( + transformArguments('source', 'destination', { + LIMIT: { + offset: 0, + count: 1 + } + }), + ['SORT', 'source', 'LIMIT', '0', '1', 'STORE', 'destination'] + ); + }); + + describe('with GET', () => { + it('string', () => { + assert.deepEqual( + transformArguments('source', 'destination', { + GET: 'pattern' + }), + ['SORT', 'source', 'GET', 'pattern', 'STORE', 'destination'] + ); + }); + + it('array', () => { + assert.deepEqual( + transformArguments('source', 'destination', { + GET: ['1', '2'] + }), + ['SORT', 'source', 'GET', '1', 'GET', '2', 'STORE', 'destination'] + ); + }); + }); + + it('with DIRECTION', () => { + assert.deepEqual( + transformArguments('source', 'destination', { + DIRECTION: 'ASC' + }), + ['SORT', 'source', 'ASC', 'STORE', 'destination'] + ); + }); + + it('with ALPHA', () => { + assert.deepEqual( + transformArguments('source', 'destination', { + ALPHA: true + }), + ['SORT', 'source', 'ALPHA', 'STORE', 'destination'] + ); + }); + + it('with BY, LIMIT, GET, DIRECTION, ALPHA', () => { + assert.deepEqual( + transformArguments('source', 'destination', { + BY: 'pattern', + LIMIT: { + offset: 0, + count: 1 + }, + GET: 'pattern', + DIRECTION: 'ASC', + ALPHA: true + }), + ['SORT', 'source', 'BY', 'pattern', 'LIMIT', '0', '1', 'GET', 'pattern', 'ASC', 'ALPHA', 'STORE', 'destination'] + ); + }); + }); + + testUtils.testWithClient('client.sortStore', async client => { + assert.equal( + await client.sortStore('source', 'destination'), + 0 + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/client/lib/commands/SORT_STORE.ts b/packages/client/lib/commands/SORT_STORE.ts new file mode 100644 index 0000000000..9acaf02317 --- /dev/null +++ b/packages/client/lib/commands/SORT_STORE.ts @@ -0,0 +1,17 @@ +import { RedisCommandArguments } from '.'; +import { SortOptions } from './generic-transformers'; +import { transformArguments as transformSortArguments } from './SORT'; + +export const FIRST_KEY_INDEX = 1; + +export function transformArguments( + source: string, + destination: string, + options?: SortOptions +): RedisCommandArguments { + const args = transformSortArguments(source, options); + args.push('STORE', destination); + return args; +} + +export declare function transformReply(): number; diff --git a/packages/client/lib/commands/ZINTERCARD.spec.ts b/packages/client/lib/commands/ZINTERCARD.spec.ts new file mode 100644 index 0000000000..a2b70616d5 --- /dev/null +++ b/packages/client/lib/commands/ZINTERCARD.spec.ts @@ -0,0 +1,30 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './ZINTERCARD'; + +describe('ZINTERCARD', () => { + testUtils.isVersionGreaterThanHook([7, 0]); + + describe('transformArguments', () => { + it('simple', () => { + assert.deepEqual( + transformArguments(['1', '2']), + ['ZINTERCARD', '2', '1', '2'] + ); + }); + + it('with limit', () => { + assert.deepEqual( + transformArguments(['1', '2'], 1), + ['ZINTERCARD', '2', '1', '2', 'LIMIT', '1'] + ); + }); + }); + + testUtils.testWithClient('client.zInterCard', async client => { + assert.deepEqual( + await client.zInterCard('key'), + 0 + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/client/lib/commands/ZINTERCARD.ts b/packages/client/lib/commands/ZINTERCARD.ts new file mode 100644 index 0000000000..ff45ab2aa0 --- /dev/null +++ b/packages/client/lib/commands/ZINTERCARD.ts @@ -0,0 +1,21 @@ +import { RedisCommandArgument, RedisCommandArguments } from '.'; +import { pushVerdictArgument } from './generic-transformers'; + +export const FIRST_KEY_INDEX = 2; + +export const IS_READ_ONLY = true; + +export function transformArguments( + keys: Array | RedisCommandArgument, + limit?: number +): RedisCommandArguments { + const args = pushVerdictArgument(['ZINTERCARD'], keys); + + if (limit) { + args.push('LIMIT', limit.toString()); + } + + return args; +} + +export declare function transformReply(): number; diff --git a/packages/client/lib/commands/generic-transformers.spec.ts b/packages/client/lib/commands/generic-transformers.spec.ts index 96dca31dad..301cab0a75 100644 --- a/packages/client/lib/commands/generic-transformers.spec.ts +++ b/packages/client/lib/commands/generic-transformers.spec.ts @@ -19,11 +19,13 @@ import { transformPXAT, pushEvalArguments, pushVerdictArguments, + pushVerdictNumberArguments, pushVerdictArgument, pushOptionalVerdictArgument, transformCommandReply, CommandFlags, - CommandCategories + CommandCategories, + pushSlotRangesArguments } from './generic-transformers'; describe('Generic Transformers', () => { @@ -578,6 +580,22 @@ describe('Generic Transformers', () => { }); }); + describe('pushVerdictNumberArguments', () => { + it('number', () => { + assert.deepEqual( + pushVerdictNumberArguments([], 0), + ['0'] + ); + }); + + it('array', () => { + assert.deepEqual( + pushVerdictNumberArguments([], [0, 1]), + ['0', '1'] + ); + }); + }); + describe('pushVerdictArgument', () => { it('string', () => { assert.deepEqual( @@ -639,4 +657,29 @@ describe('Generic Transformers', () => { } ); }); + + describe('pushSlotRangesArguments', () => { + it('single range', () => { + assert.deepEqual( + pushSlotRangesArguments([], { + start: 0, + end: 1 + }), + ['0', '1'] + ); + }); + + it('multiple ranges', () => { + assert.deepEqual( + pushSlotRangesArguments([], [{ + start: 0, + end: 1 + }, { + start: 2, + end: 3 + }]), + ['0', '1', '2', '3'] + ); + }); + }); }); diff --git a/packages/client/lib/commands/generic-transformers.ts b/packages/client/lib/commands/generic-transformers.ts index 0799476ae6..7850d22ed4 100644 --- a/packages/client/lib/commands/generic-transformers.ts +++ b/packages/client/lib/commands/generic-transformers.ts @@ -322,6 +322,21 @@ export function pushVerdictArguments(args: RedisCommandArguments, value: RedisCo return args; } +export function pushVerdictNumberArguments( + args: RedisCommandArguments, + value: number | Array +): RedisCommandArguments { + if (Array.isArray(value)) { + for (const item of value) { + args.push(item.toString()); + } + } else { + args.push(value.toString()); + } + + return args; +} + export function pushVerdictArgument( args: RedisCommandArguments, value: RedisCommandArgument | Array @@ -422,3 +437,77 @@ export function transformCommandReply( categories: new Set(categories) }; } + +export interface SortOptions { + BY?: string; + LIMIT?: { + offset: number; + count: number; + }, + GET?: string | Array; + DIRECTION?: 'ASC' | 'DESC'; + ALPHA?: true; +} + +export function pushSortArguments( + args: RedisCommandArguments, + options?: SortOptions +): RedisCommandArguments { + if (options?.BY) { + args.push('BY', options.BY); + } + + if (options?.LIMIT) { + args.push( + 'LIMIT', + options.LIMIT.offset.toString(), + options.LIMIT.count.toString() + ); + } + + if (options?.GET) { + for (const pattern of (typeof options.GET === 'string' ? [options.GET] : options.GET)) { + args.push('GET', pattern); + } + } + + if (options?.DIRECTION) { + args.push(options.DIRECTION); + } + + if (options?.ALPHA) { + args.push('ALPHA'); + } + + return args; +} + +export interface SlotRange { + start: number; + end: number; +} + +function pushSlotRangeArguments( + args: RedisCommandArguments, + range: SlotRange +): void { + args.push( + range.start.toString(), + range.end.toString() + ); +} + +export function pushSlotRangesArguments( + args: RedisCommandArguments, + ranges: SlotRange | Array +): RedisCommandArguments { + if (Array.isArray(ranges)) { + for (const range of ranges) { + pushSlotRangeArguments(args, range); + } + } else { + pushSlotRangeArguments(args, ranges); + } + + return args; +} diff --git a/packages/client/package.json b/packages/client/package.json index fb7f6a6af3..e2e13a896c 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@node-redis/client", - "version": "1.0.4", + "version": "1.0.5", "license": "MIT", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -22,20 +22,20 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@node-redis/test-utils": "*", - "@types/node": "^17.0.13", + "@types/node": "^17.0.23", "@types/redis-parser": "^3.0.0", - "@types/sinon": "^10.0.9", + "@types/sinon": "^10.0.11", "@types/yallist": "^4.0.1", - "@typescript-eslint/eslint-plugin": "^5.10.1", - "@typescript-eslint/parser": "^5.10.1", - "eslint": "^8.8.0", + "@typescript-eslint/eslint-plugin": "^5.16.0", + "@typescript-eslint/parser": "^5.16.0", + "eslint": "^8.12.0", "nyc": "^15.1.0", - "release-it": "^14.12.4", - "sinon": "^13.0.0", + "release-it": "^14.13.1", + "sinon": "^13.0.1", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typedoc": "^0.22.11", - "typescript": "^4.5.5" + "ts-node": "^10.7.0", + "typedoc": "^0.22.13", + "typescript": "^4.6.3" }, "engines": { "node": ">=12" diff --git a/packages/graph/package.json b/packages/graph/package.json index ed4112766c..66fccd689a 100644 --- a/packages/graph/package.json +++ b/packages/graph/package.json @@ -18,12 +18,12 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@node-redis/test-utils": "*", - "@types/node": "^17.0.13", + "@types/node": "^17.0.23", "nyc": "^15.1.0", - "release-it": "^14.12.4", + "release-it": "^14.13.1", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typedoc": "^0.22.11", - "typescript": "^4.5.5" + "ts-node": "^10.7.0", + "typedoc": "^0.22.13", + "typescript": "^4.6.3" } } diff --git a/packages/json/package.json b/packages/json/package.json index 361928215a..0516a7b1b0 100644 --- a/packages/json/package.json +++ b/packages/json/package.json @@ -18,12 +18,12 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@node-redis/test-utils": "*", - "@types/node": "^17.0.13", + "@types/node": "^17.0.23", "nyc": "^15.1.0", - "release-it": "^14.12.4", + "release-it": "^14.13.1", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typedoc": "^0.22.11", - "typescript": "^4.5.5" + "ts-node": "^10.7.0", + "typedoc": "^0.22.13", + "typescript": "^4.6.3" } } diff --git a/packages/search/lib/commands/AGGREGATE.spec.ts b/packages/search/lib/commands/AGGREGATE.spec.ts index 24684d447d..a233007643 100644 --- a/packages/search/lib/commands/AGGREGATE.spec.ts +++ b/packages/search/lib/commands/AGGREGATE.spec.ts @@ -434,6 +434,26 @@ describe('AGGREGATE', () => { ); }); }); + + it('with PARAMS', () => { + assert.deepEqual( + transformArguments('index', '*', { + PARAMS: { + param: 'value' + } + }), + ['FT.AGGREGATE', 'index', '*', 'PARAMS', '2', 'param', 'value'] + ); + }); + + it('with DIALECT', () => { + assert.deepEqual( + transformArguments('index', '*', { + DIALECT: 1 + }), + ['FT.AGGREGATE', 'index', '*', 'DIALECT', '1'] + ); + }); }); testUtils.testWithClient('client.ft.aggregate', async client => { diff --git a/packages/search/lib/commands/AGGREGATE.ts b/packages/search/lib/commands/AGGREGATE.ts index 84a8f9a55a..cc7e9cba40 100644 --- a/packages/search/lib/commands/AGGREGATE.ts +++ b/packages/search/lib/commands/AGGREGATE.ts @@ -1,6 +1,6 @@ import { RedisCommandArgument, RedisCommandArguments } from '@node-redis/client/dist/lib/commands'; import { pushVerdictArgument, transformTuplesReply } from '@node-redis/client/dist/lib/commands/generic-transformers'; -import { PropertyName, pushArgumentsWithLength, pushSortByArguments, SortByProperty } from '.'; +import { Params, PropertyName, pushArgumentsWithLength, pushParamsArgs, pushSortByArguments, SortByProperty } from '.'; export enum AggregateSteps { GROUPBY = 'GROUPBY', @@ -122,6 +122,8 @@ export interface AggregateOptions { VERBATIM?: true; LOAD?: LoadField | Array; STEPS?: Array; + PARAMS?: Params; + DIALECT?: number; } export function transformArguments( @@ -129,17 +131,16 @@ export function transformArguments( query: string, options?: AggregateOptions ): RedisCommandArguments { - - const args = ['FT.AGGREGATE', index, query]; - pushAggregatehOptions(args, options); - return args; + return pushAggregatehOptions( + ['FT.AGGREGATE', index, query], + options + ); } export function pushAggregatehOptions( args: RedisCommandArguments, options?: AggregateOptions ): RedisCommandArguments { - if (options?.VERBATIM) { args.push('VERBATIM'); } @@ -202,6 +203,12 @@ export function pushAggregatehOptions( } } + pushParamsArgs(args, options?.PARAMS); + + if (options?.DIALECT) { + args.push('DIALECT', options.DIALECT.toString()); + } + return args; } @@ -257,7 +264,6 @@ function pushGroupByReducer(args: RedisCommandArguments, reducer: GroupByReducer } } }); - break; } diff --git a/packages/search/lib/commands/CREATE.spec.ts b/packages/search/lib/commands/CREATE.spec.ts index 35aec47a67..765e3dbf7d 100644 --- a/packages/search/lib/commands/CREATE.spec.ts +++ b/packages/search/lib/commands/CREATE.spec.ts @@ -1,7 +1,7 @@ import { strict as assert } from 'assert'; import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './CREATE'; -import { SchemaFieldTypes, SchemaTextFieldPhonetics, RedisSearchLanguages } from '.'; +import { SchemaFieldTypes, SchemaTextFieldPhonetics, RedisSearchLanguages, VectorAlgorithms } from '.'; describe('CREATE', () => { describe('transformArguments', () => { @@ -126,6 +126,52 @@ describe('CREATE', () => { }); }); + describe('VECTOR', () => { + it('Flat algorithm', () => { + assert.deepEqual( + transformArguments('index', { + field: { + type: SchemaFieldTypes.VECTOR, + ALGORITHM: VectorAlgorithms.FLAT, + TYPE: 'FLOAT32', + DIM: 2, + DISTANCE_METRIC: 'L2', + INITIAL_CAP: 1000000, + BLOCK_SIZE: 1000 + } + }), + [ + 'FT.CREATE', 'index', 'SCHEMA', 'field', 'VECTOR', 'FLAT', '10', 'TYPE', + 'FLOAT32', 'DIM', '2', 'DISTANCE_METRIC', 'L2', 'INITIAL_CAP', '1000000', + 'BLOCK_SIZE', '1000' + ] + ); + }); + + it('HNSW algorithm', () => { + assert.deepEqual( + transformArguments('index', { + field: { + type: SchemaFieldTypes.VECTOR, + ALGORITHM: VectorAlgorithms.HNSW, + TYPE: 'FLOAT32', + DIM: 2, + DISTANCE_METRIC: 'L2', + INITIAL_CAP: 1000000, + M: 40, + EF_CONSTRUCTION: 250, + EF_RUNTIME: 20 + } + }), + [ + 'FT.CREATE', 'index', 'SCHEMA', 'field', 'VECTOR', 'HNSW', '14', 'TYPE', + 'FLOAT32', 'DIM', '2', 'DISTANCE_METRIC', 'L2', 'INITIAL_CAP', '1000000', + 'M', '40', 'EF_CONSTRUCTION', '250', 'EF_RUNTIME', '20' + ] + ); + }); + }); + describe('with generic options', () => { it('with AS', () => { assert.deepEqual( diff --git a/packages/search/lib/commands/EXPLAIN.spec.ts b/packages/search/lib/commands/EXPLAIN.spec.ts index dd55e03871..d24f5fe4ac 100644 --- a/packages/search/lib/commands/EXPLAIN.spec.ts +++ b/packages/search/lib/commands/EXPLAIN.spec.ts @@ -2,10 +2,32 @@ import { strict as assert } from 'assert'; import { transformArguments } from './EXPLAIN'; describe('EXPLAIN', () => { - it('transformArguments', () => { - assert.deepEqual( - transformArguments('index', '*'), - ['FT.EXPLAIN', 'index', '*'] - ); + describe('transformArguments', () => { + it('simple', () => { + assert.deepEqual( + transformArguments('index', '*'), + ['FT.EXPLAIN', 'index', '*'] + ); + }); + + it('with PARAMS', () => { + assert.deepEqual( + transformArguments('index', '*', { + PARAMS: { + param: 'value' + } + }), + ['FT.EXPLAIN', 'index', '*', 'PARAMS', '2', 'param', 'value'] + ); + }); + + it('with DIALECT', () => { + assert.deepEqual( + transformArguments('index', '*', { + DIALECT: 1 + }), + ['FT.EXPLAIN', 'index', '*', 'DIALECT', '1'] + ); + }); }); }); diff --git a/packages/search/lib/commands/EXPLAIN.ts b/packages/search/lib/commands/EXPLAIN.ts index c41cd9a4aa..ab3935ff97 100644 --- a/packages/search/lib/commands/EXPLAIN.ts +++ b/packages/search/lib/commands/EXPLAIN.ts @@ -1,7 +1,26 @@ +import { Params, pushParamsArgs } from "."; + export const IS_READ_ONLY = true; -export function transformArguments(index: string, query: string): Array { - return ['FT.EXPLAIN', index, query]; +interface ExplainOptions { + PARAMS?: Params; + DIALECT?: number; +} + +export function transformArguments( + index: string, + query: string, + options?: ExplainOptions +): Array { + const args = ['FT.EXPLAIN', index, query]; + + pushParamsArgs(args, options?.PARAMS); + + if (options?.DIALECT) { + args.push('DIALECT', options.DIALECT.toString()); + } + + return args; } export declare function transformReply(): string; diff --git a/packages/search/lib/commands/INFO.spec.ts b/packages/search/lib/commands/INFO.spec.ts index 2ee3048c01..e026b44e26 100644 --- a/packages/search/lib/commands/INFO.spec.ts +++ b/packages/search/lib/commands/INFO.spec.ts @@ -15,32 +15,56 @@ describe('INFO', () => { await client.ft.create('index', { field: SchemaFieldTypes.TEXT }); - assert.deepEqual( await client.ft.info('index'), { indexName: 'index', indexOptions: [], - indexDefinition: { - defaultScore: '1', - keyType: 'HASH', - prefixes: [''] - }, - attributes: [[ - 'identifier', - 'field', - 'attribute', - 'field', - 'type', - 'TEXT', - 'WEIGHT', - '1' - ]], + indexDefinition: Object.create(null, { + default_score: { + value: '1', + configurable: true, + enumerable: true + }, + key_type: { + value: 'HASH', + configurable: true, + enumerable: true + }, + prefixes: { + value: [''], + configurable: true, + enumerable: true + } + }), + attributes: [Object.create(null, { + identifier: { + value: 'field', + configurable: true, + enumerable: true + }, + attribute: { + value: 'field', + configurable: true, + enumerable: true + }, + type: { + value: 'TEXT', + configurable: true, + enumerable: true + }, + WEIGHT: { + value: '1', + configurable: true, + enumerable: true + } + })], numDocs: '0', maxDocId: '0', numTerms: '0', numRecords: '0', invertedSzMb: '0', + vectorIndexSzMb: '0', totalInvertedIndexBlocks: '0', offsetVectorsSzMb: '0', docTableSizeMb: '0', @@ -67,7 +91,8 @@ describe('INFO', () => { globalTotal: 0, indexCapacity: 128, idnexTotal: 0 - } + }, + stopWords: undefined } ); }, GLOBAL.SERVERS.OPEN); diff --git a/packages/search/lib/commands/INFO.ts b/packages/search/lib/commands/INFO.ts index 42451114c8..b4072aa759 100644 --- a/packages/search/lib/commands/INFO.ts +++ b/packages/search/lib/commands/INFO.ts @@ -1,121 +1,118 @@ +import { RedisCommandArgument } from '@node-redis/client/dist/lib/commands'; +import { transformTuplesReply } from '@node-redis/client/dist/lib/commands/generic-transformers'; + export function transformArguments(index: string): Array { return ['FT.INFO', index]; } type InfoRawReply = [ - _: string, - indexName: string, - _: string, - indexOptions: Array, - _: string, - indexDefinition: [ - _: string, - keyType: string, - _: string, - prefixes: Array, - _: string, - defaultScore: string + 'index_name', + RedisCommandArgument, + 'index_options', + Array, + 'index_definition', + Array, + 'attributes', + Array>, + 'num_docs', + RedisCommandArgument, + 'max_doc_id', + RedisCommandArgument, + 'num_terms', + RedisCommandArgument, + 'num_records', + RedisCommandArgument, + 'inverted_sz_mb', + RedisCommandArgument, + 'vector_index_sz_mb', + RedisCommandArgument, + 'total_inverted_index_blocks', + RedisCommandArgument, + 'offset_vectors_sz_mb', + RedisCommandArgument, + 'doc_table_size_mb', + RedisCommandArgument, + 'sortable_values_size_mb', + RedisCommandArgument, + 'key_table_size_mb', + RedisCommandArgument, + 'records_per_doc_avg', + RedisCommandArgument, + 'bytes_per_record_avg', + RedisCommandArgument, + 'offsets_per_term_avg', + RedisCommandArgument, + 'offset_bits_per_record_avg', + RedisCommandArgument, + 'hash_indexing_failures', + RedisCommandArgument, + 'indexing', + RedisCommandArgument, + 'percent_indexed', + RedisCommandArgument, + 'gc_stats', + [ + 'bytes_collected', + RedisCommandArgument, + 'total_ms_run', + RedisCommandArgument, + 'total_cycles', + RedisCommandArgument, + 'average_cycle_time_ms', + RedisCommandArgument, + 'last_run_time_ms', + RedisCommandArgument, + 'gc_numeric_trees_missed', + RedisCommandArgument, + 'gc_blocks_denied', + RedisCommandArgument ], - _: string, - attributes: Array>, - _: string, - numDocs: string, - _: string, - maxDocId: string, - _: string, - numTerms: string, - _: string, - numRecords: string, - _: string, - invertedSzMb: string, - _: string, - totalInvertedIndexBlocks: string, - _: string, - offsetVectorsSzMb: string, - _: string, - docTableSizeMb: string, - _: string, - sortableValuesSizeMb: string, - _: string, - keyTableSizeMb: string, - _: string, - recordsPerDocAvg: string, - _: string, - bytesPerRecordAvg: string, - _: string, - offsetsPerTermAvg: string, - _: string, - offsetBitsPerRecordAvg: string, - _: string, - hashIndexingFailures: string, - _: string, - indexing: string, - _: string, - percentIndexed: string, - _: string, - gcStats: [ - _: string, - bytesCollected: string, - _: string, - totalMsRun: string, - _: string, - totalCycles: string, - _: string, - averageCycleTimeMs: string, - _: string, - lastRunTimeMs: string, - _: string, - gcNumericTreesMissed: string, - _: string, - gcBlocksDenied: string + 'cursor_stats', + [ + 'global_idle', + number, + 'global_total', + number, + 'index_capacity', + number, + 'index_total', + number ], - _: string, - cursorStats: [ - _: string, - globalIdle: number, - _: string, - globalTotal: number, - _: string, - indexCapacity: number, - _: string, - idnexTotal: number - ] + 'stopwords_list'?, + Array? ]; interface InfoReply { - indexName: string; - indexOptions: Array; - indexDefinition: { - keyType: string; - prefixes: Array; - defaultScore: string; - }; - attributes: Array>; - numDocs: string; - maxDocId: string; - numTerms: string; - numRecords: string; - invertedSzMb: string; - totalInvertedIndexBlocks: string; - offsetVectorsSzMb: string; - docTableSizeMb: string; - sortableValuesSizeMb: string; - keyTableSizeMb: string; - recordsPerDocAvg: string; - bytesPerRecordAvg: string; - offsetsPerTermAvg: string; - offsetBitsPerRecordAvg: string; - hashIndexingFailures: string; - indexing: string; - percentIndexed: string; + indexName: RedisCommandArgument; + indexOptions: Array; + indexDefinition: Record; + attributes: Array>; + numDocs: RedisCommandArgument; + maxDocId: RedisCommandArgument; + numTerms: RedisCommandArgument; + numRecords: RedisCommandArgument; + invertedSzMb: RedisCommandArgument; + vectorIndexSzMb: RedisCommandArgument; + totalInvertedIndexBlocks: RedisCommandArgument; + offsetVectorsSzMb: RedisCommandArgument; + docTableSizeMb: RedisCommandArgument; + sortableValuesSizeMb: RedisCommandArgument; + keyTableSizeMb: RedisCommandArgument; + recordsPerDocAvg: RedisCommandArgument; + bytesPerRecordAvg: RedisCommandArgument; + offsetsPerTermAvg: RedisCommandArgument; + offsetBitsPerRecordAvg: RedisCommandArgument; + hashIndexingFailures: RedisCommandArgument; + indexing: RedisCommandArgument; + percentIndexed: RedisCommandArgument; gcStats: { - bytesCollected: string; - totalMsRun: string; - totalCycles: string; - averageCycleTimeMs: string; - lastRunTimeMs: string; - gcNumericTreesMissed: string; - gcBlocksDenied: string; + bytesCollected: RedisCommandArgument; + totalMsRun: RedisCommandArgument; + totalCycles: RedisCommandArgument; + averageCycleTimeMs: RedisCommandArgument; + lastRunTimeMs: RedisCommandArgument; + gcNumericTreesMissed: RedisCommandArgument; + gcBlocksDenied: RedisCommandArgument; }; cursorStats: { globalIdle: number; @@ -123,49 +120,49 @@ interface InfoReply { indexCapacity: number; idnexTotal: number; }; + stopWords: Array | undefined; } export function transformReply(rawReply: InfoRawReply): InfoReply { + console.log(rawReply); return { indexName: rawReply[1], indexOptions: rawReply[3], - indexDefinition: { - keyType: rawReply[5][1], - prefixes: rawReply[5][3], - defaultScore: rawReply[5][5] - }, - attributes: rawReply[7], + indexDefinition: transformTuplesReply(rawReply[5]), + attributes: rawReply[7].map(attribute => transformTuplesReply(attribute)), numDocs: rawReply[9], maxDocId: rawReply[11], numTerms: rawReply[13], numRecords: rawReply[15], invertedSzMb: rawReply[17], - totalInvertedIndexBlocks: rawReply[19], - offsetVectorsSzMb: rawReply[21], - docTableSizeMb: rawReply[23], - sortableValuesSizeMb: rawReply[25], - keyTableSizeMb: rawReply[27], - recordsPerDocAvg: rawReply[29], - bytesPerRecordAvg: rawReply[31], - offsetsPerTermAvg: rawReply[33], - offsetBitsPerRecordAvg: rawReply[35], - hashIndexingFailures: rawReply[37], - indexing: rawReply[39], - percentIndexed: rawReply[41], + vectorIndexSzMb: rawReply[19], + totalInvertedIndexBlocks: rawReply[21], + offsetVectorsSzMb: rawReply[23], + docTableSizeMb: rawReply[25], + sortableValuesSizeMb: rawReply[27], + keyTableSizeMb: rawReply[29], + recordsPerDocAvg: rawReply[31], + bytesPerRecordAvg: rawReply[33], + offsetsPerTermAvg: rawReply[35], + offsetBitsPerRecordAvg: rawReply[37], + hashIndexingFailures: rawReply[39], + indexing: rawReply[41], + percentIndexed: rawReply[43], gcStats: { - bytesCollected: rawReply[43][1], - totalMsRun: rawReply[43][3], - totalCycles: rawReply[43][5], - averageCycleTimeMs: rawReply[43][7], - lastRunTimeMs: rawReply[43][9], - gcNumericTreesMissed: rawReply[43][11], - gcBlocksDenied: rawReply[43][13] + bytesCollected: rawReply[45][1], + totalMsRun: rawReply[45][3], + totalCycles: rawReply[45][5], + averageCycleTimeMs: rawReply[45][7], + lastRunTimeMs: rawReply[45][9], + gcNumericTreesMissed: rawReply[45][11], + gcBlocksDenied: rawReply[45][13] }, cursorStats: { - globalIdle: rawReply[45][1], - globalTotal: rawReply[45][3], - indexCapacity: rawReply[45][5], - idnexTotal: rawReply[45][7] - } + globalIdle: rawReply[47][1], + globalTotal: rawReply[47][3], + indexCapacity: rawReply[47][5], + idnexTotal: rawReply[47][7] + }, + stopWords: rawReply[49] }; } diff --git a/packages/search/lib/commands/PROFILE_SEARCH.ts b/packages/search/lib/commands/PROFILE_SEARCH.ts index bdb67ec387..6e7cd536e7 100644 --- a/packages/search/lib/commands/PROFILE_SEARCH.ts +++ b/packages/search/lib/commands/PROFILE_SEARCH.ts @@ -1,5 +1,6 @@ import { SearchOptions, SearchRawReply, transformReply as transformSearchReply } from './SEARCH'; import { pushSearchOptions, ProfileOptions, ProfileRawReply, ProfileReply, transformProfile } from '.'; +import { RedisCommandArguments } from '@node-redis/client/dist/lib/commands'; export const IS_READ_ONLY = true; @@ -7,7 +8,7 @@ export function transformArguments( index: string, query: string, options?: ProfileOptions & SearchOptions -): Array { +): RedisCommandArguments { const args = ['FT.PROFILE', index, 'SEARCH']; if (options?.LIMITED) { @@ -15,8 +16,7 @@ export function transformArguments( } args.push('QUERY', query); - pushSearchOptions(args, options) - return args; + return pushSearchOptions(args, options); } type ProfileSearchRawReply = ProfileRawReply; diff --git a/packages/search/lib/commands/SEARCH.spec.ts b/packages/search/lib/commands/SEARCH.spec.ts index c2f2c295c8..aecf6c8b1a 100644 --- a/packages/search/lib/commands/SEARCH.spec.ts +++ b/packages/search/lib/commands/SEARCH.spec.ts @@ -213,31 +213,98 @@ describe('SEARCH', () => { ['FT.SEARCH', 'index', 'query', 'LIMIT', '0', '1'] ); }); + + it('with PARAMS', () => { + assert.deepEqual( + transformArguments('index', 'query', { + PARAMS: { + param: 'value' + } + }), + ['FT.SEARCH', 'index', 'query', 'PARAMS', '2', 'param', 'value'] + ); + }); + + it('with DIALECT', () => { + assert.deepEqual( + transformArguments('index', 'query', { + DIALECT: 1 + }), + ['FT.SEARCH', 'index', 'query', 'DIALECT', '1'] + ); + }); }); - testUtils.testWithClient('client.ft.search', async client => { - await Promise.all([ - client.ft.create('index', { - field: SchemaFieldTypes.NUMERIC - }), - client.hSet('1', 'field', '1') - ]); + describe('client.ft.search', () => { + testUtils.testWithClient('DIALECT 1', async client => { + await Promise.all([ + client.ft.create('index', { + field: SchemaFieldTypes.NUMERIC + }), + client.hSet('1', 'field', '1') + ]); - assert.deepEqual( - await client.ft.search('index', '*'), - { - total: 1, - documents: [{ - id: '1', - value: Object.create(null, { - field: { - value: '1', - configurable: true, - enumerable: true - } - }) - }] - } - ); - }, GLOBAL.SERVERS.OPEN); + assert.deepEqual( + await client.ft.search('index', '*', { + DIALECT: 1 + }), + { + total: 1, + documents: [{ + id: '1', + value: Object.create(null, { + field: { + value: '1', + configurable: true, + enumerable: true + } + }) + }] + } + ); + }, GLOBAL.SERVERS.OPEN); + + testUtils.testWithClient('DIALECT 2', async client => { + await Promise.all([ + client.ft.create('index', { + field: SchemaFieldTypes.NUMERIC + }), + client.hSet('1', 'field', '1'), + client.hSet('2', 'field', '2'), + client.hSet('3', 'field', '3') + ]); + + assert.deepEqual( + await client.ft.search('index', '@field:[$min $max]', { + PARAMS: { + min: 1, + max: 2 + }, + DIALECT: 2 + }), + { + total: 2, + documents: [{ + id: '1', + value: Object.create(null, { + field: { + value: '1', + configurable: true, + enumerable: true + } + }) + }, { + id: '2', + value: Object.create(null, { + field: { + value: '2', + configurable: true, + enumerable: true + } + }) + }] + } + ); + }, GLOBAL.SERVERS.OPEN); + }); }); diff --git a/packages/search/lib/commands/SEARCH.ts b/packages/search/lib/commands/SEARCH.ts index efbe24e151..3a9899975c 100644 --- a/packages/search/lib/commands/SEARCH.ts +++ b/packages/search/lib/commands/SEARCH.ts @@ -1,6 +1,6 @@ import { RedisCommandArguments } from '@node-redis/client/dist/lib/commands'; import { transformTuplesReply } from '@node-redis/client/dist/lib/commands/generic-transformers'; -import { pushSearchOptions, RedisSearchLanguages, PropertyName, SortByProperty, SearchReply } from '.'; +import { pushSearchOptions, RedisSearchLanguages, Params, PropertyName, SortByProperty, SearchReply } from '.'; export const FIRST_KEY_INDEX = 1; @@ -54,6 +54,8 @@ export interface SearchOptions { from: number | string; size: number | string; }; + PARAMS?: Params; + DIALECT?: number; } export function transformArguments( @@ -61,9 +63,10 @@ export function transformArguments( query: string, options?: SearchOptions ): RedisCommandArguments { - const args: RedisCommandArguments = ['FT.SEARCH', index, query]; - pushSearchOptions(args, options); - return args; + return pushSearchOptions( + ['FT.SEARCH', index, query], + options + ); } export type SearchRawReply = Array; diff --git a/packages/search/lib/commands/SPELLCHECK.spec.ts b/packages/search/lib/commands/SPELLCHECK.spec.ts index fe74f5910f..acabbe8a87 100644 --- a/packages/search/lib/commands/SPELLCHECK.spec.ts +++ b/packages/search/lib/commands/SPELLCHECK.spec.ts @@ -47,6 +47,15 @@ describe('SPELLCHECK', () => { ); }); }); + + it('with DIALECT', () => { + assert.deepEqual( + transformArguments('index', 'query', { + DIALECT: 1 + }), + ['FT.SPELLCHECK', 'index', 'query', 'DIALECT', '1'] + ); + }); }); testUtils.testWithClient('client.ft.spellCheck', async client => { diff --git a/packages/search/lib/commands/SPELLCHECK.ts b/packages/search/lib/commands/SPELLCHECK.ts index ae4cb3cdce..c9317a8b4f 100644 --- a/packages/search/lib/commands/SPELLCHECK.ts +++ b/packages/search/lib/commands/SPELLCHECK.ts @@ -6,6 +6,7 @@ interface SpellCheckTerms { interface SpellCheckOptions { DISTANCE?: number; TERMS?: SpellCheckTerms | Array; + DIALECT?: number; } export function transformArguments(index: string, query: string, options?: SpellCheckOptions): Array { @@ -25,6 +26,10 @@ export function transformArguments(index: string, query: string, options?: Spell } } + if (options?.DIALECT) { + args.push('DIALECT', options.DIALECT.toString()); + } + return args; } diff --git a/packages/search/lib/commands/index.ts b/packages/search/lib/commands/index.ts index 0379f9252d..51ab50175e 100644 --- a/packages/search/lib/commands/index.ts +++ b/packages/search/lib/commands/index.ts @@ -28,7 +28,7 @@ import * as SUGLEN from './SUGLEN'; import * as SYNDUMP from './SYNDUMP'; import * as SYNUPDATE from './SYNUPDATE'; import * as TAGVALS from './TAGVALS'; -import { RedisCommandArguments } from '@node-redis/client/dist/lib/commands'; +import { RedisCommandArgument, RedisCommandArguments } from '@node-redis/client/dist/lib/commands'; import { pushOptionalVerdictArgument, pushVerdictArgument } from '@node-redis/client/dist/lib/commands/generic-transformers'; import { SearchOptions } from './SEARCH'; @@ -172,16 +172,29 @@ export enum SchemaFieldTypes { TEXT = 'TEXT', NUMERIC = 'NUMERIC', GEO = 'GEO', - TAG = 'TAG' + TAG = 'TAG', + VECTOR = 'VECTOR' } -type CreateSchemaField> = T | ({ +type CreateSchemaField< + T extends SchemaFieldTypes, + E = Record +> = T | ({ type: T; AS?: string; - SORTABLE?: true | 'UNF'; - NOINDEX?: true; } & E); +type CreateSchemaCommonField< + T extends SchemaFieldTypes, + E = Record +> = CreateSchemaField< + T, + ({ + SORTABLE?: true | 'UNF'; + NOINDEX?: true; + } & E) +>; + export enum SchemaTextFieldPhonetics { DM_EN = 'dm:en', DM_FR = 'dm:fr', @@ -189,27 +202,55 @@ export enum SchemaTextFieldPhonetics { DM_ES = 'dm:es' } -type CreateSchemaTextField = CreateSchemaField; -type CreateSchemaNumericField = CreateSchemaField; +type CreateSchemaNumericField = CreateSchemaCommonField; -type CreateSchemaGeoField = CreateSchemaField; +type CreateSchemaGeoField = CreateSchemaCommonField; -type CreateSchemaTagField = CreateSchemaField; +export enum VectorAlgorithms { + FLAT = 'FLAT', + HNSW = 'HNSW' +} + +type CreateSchemaVectorField< + T extends VectorAlgorithms, + A extends Record +> = CreateSchemaField; + +type CreateSchemaFlatVectorField = CreateSchemaVectorField; + +type CreateSchemaHNSWVectorField = CreateSchemaVectorField; + export interface RediSearchSchema { [field: string]: CreateSchemaTextField | CreateSchemaNumericField | CreateSchemaGeoField | - CreateSchemaTagField; + CreateSchemaTagField | + CreateSchemaFlatVectorField | + CreateSchemaHNSWVectorField; } export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema) { @@ -257,6 +298,47 @@ export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema } break; + + case SchemaFieldTypes.VECTOR: + args.push(fieldOptions.ALGORITHM); + + pushArgumentsWithLength(args, () => { + args.push( + 'TYPE', fieldOptions.TYPE, + 'DIM', fieldOptions.DIM.toString(), + 'DISTANCE_METRIC', fieldOptions.DISTANCE_METRIC + ); + + if (fieldOptions.INITIAL_CAP) { + args.push('INITIAL_CAP', fieldOptions.INITIAL_CAP.toString()); + } + + switch (fieldOptions.ALGORITHM) { + case VectorAlgorithms.FLAT: + if (fieldOptions.BLOCK_SIZE) { + args.push('BLOCK_SIZE', fieldOptions.BLOCK_SIZE.toString()); + } + + break; + + case VectorAlgorithms.HNSW: + if (fieldOptions.M) { + args.push('M', fieldOptions.M.toString()); + } + + if (fieldOptions.EF_CONSTRUCTION) { + args.push('EF_CONSTRUCTION', fieldOptions.EF_CONSTRUCTION.toString()); + } + + if (fieldOptions.EF_RUNTIME) { + args.push('EF_RUNTIME', fieldOptions.EF_RUNTIME.toString()); + } + + break; + } + }); + + continue; // vector fields do not contain SORTABLE and NOINDEX options } if (fieldOptions.SORTABLE) { @@ -273,11 +355,27 @@ export function pushSchema(args: RedisCommandArguments, schema: RediSearchSchema } } +export type Params = Record; + +export function pushParamsArgs( + args: RedisCommandArguments, + params?: Params +): RedisCommandArguments { + if (params) { + const enrties = Object.entries(params); + args.push('PARAMS', (enrties.length * 2).toString()); + for (const [key, value] of enrties) { + args.push(key, value.toString()); + } + } + + return args; +} + export function pushSearchOptions( args: RedisCommandArguments, options?: SearchOptions ): RedisCommandArguments { - if (options?.VERBATIM) { args.push('VERBATIM'); } @@ -381,6 +479,16 @@ export function pushSearchOptions( ); } + if (options?.PARAMS) { + pushParamsArgs(args, options.PARAMS); + } + + if (options?.DIALECT) { + args.push('DIALECT', options.DIALECT.toString()); + } + + console.log('!@#', args); + return args; } diff --git a/packages/search/lib/index.ts b/packages/search/lib/index.ts index 93d1e9088f..296136021e 100644 --- a/packages/search/lib/index.ts +++ b/packages/search/lib/index.ts @@ -1,5 +1,5 @@ export { default } from './commands'; -export { RediSearchSchema, SchemaFieldTypes, SchemaTextFieldPhonetics, SearchReply } from './commands'; +export { RediSearchSchema, SchemaFieldTypes, SchemaTextFieldPhonetics, SearchReply, VectorAlgorithms } from './commands'; export { AggregateSteps, AggregateGroupByReducers } from './commands/AGGREGATE'; -export { SearchOptions } from './commands/SEARCH'; \ No newline at end of file +export { SearchOptions } from './commands/SEARCH'; diff --git a/packages/search/lib/test-utils.ts b/packages/search/lib/test-utils.ts index fd11951bb5..32649f729e 100644 --- a/packages/search/lib/test-utils.ts +++ b/packages/search/lib/test-utils.ts @@ -4,7 +4,7 @@ import RediSearch from '.'; export default new TestUtils({ dockerImageName: 'redislabs/redisearch', dockerImageVersionArgument: 'redisearch-version', - defaultDockerVersion: '2.2.7' + defaultDockerVersion: '2.4.3' }); export const GLOBAL = { diff --git a/packages/search/package.json b/packages/search/package.json index 43daa4d732..07ddeb72f4 100644 --- a/packages/search/package.json +++ b/packages/search/package.json @@ -1,6 +1,6 @@ { "name": "@node-redis/search", - "version": "1.0.3", + "version": "1.0.5", "license": "MIT", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -18,12 +18,12 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@node-redis/test-utils": "*", - "@types/node": "^17.0.13", + "@types/node": "^17.0.23", "nyc": "^15.1.0", - "release-it": "^14.12.4", + "release-it": "^14.13.1", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typedoc": "^0.22.11", - "typescript": "^4.5.5" + "ts-node": "^10.7.0", + "typedoc": "^0.22.13", + "typescript": "^4.6.3" } } diff --git a/packages/test-utils/lib/dockers.ts b/packages/test-utils/lib/dockers.ts index 3dd6dcf3eb..0bf4f034bf 100644 --- a/packages/test-utils/lib/dockers.ts +++ b/packages/test-utils/lib/dockers.ts @@ -38,7 +38,7 @@ const portIterator = (async function*(): AsyncIterableIterator { export interface RedisServerDockerConfig { image: string; - version: Array; + version: string; } export interface RedisServerDocker { @@ -54,7 +54,7 @@ async function spawnRedisServerDocker({ image, version }: RedisServerDockerConfi { stdout, stderr } = await execAsync( 'docker run -d --network host $(' + `docker build ${DOCKER_FODLER_PATH} -q ` + - `--build-arg IMAGE=${image}:${version.join('.')} ` + + `--build-arg IMAGE=${image}:${version} ` + `--build-arg REDIS_ARGUMENTS="--save --port ${port.toString()} ${serverArguments.join(' ')}"` + ')' ); diff --git a/packages/test-utils/lib/index.ts b/packages/test-utils/lib/index.ts index 56847ce84d..9eaed1f8d3 100644 --- a/packages/test-utils/lib/index.ts +++ b/packages/test-utils/lib/index.ts @@ -27,49 +27,61 @@ interface ClusterTestOptions ext numberOfNodes?: number; } +interface Version { + string: string; + numbers: Array; +} + export default class TestUtils { - static #getVersion(argumentName: string, defaultVersion: string): Array { + static #getVersion(argumentName: string, defaultVersion: string): Version { return yargs(hideBin(process.argv)) .option(argumentName, { type: 'string', default: defaultVersion }) .coerce(argumentName, (arg: string) => { - return arg.split('.').map(x => { - const value = Number(x); - if (Number.isNaN(value)) { - throw new TypeError(`${arg} is not a valid redis version`); - } + const indexOfDash = arg.indexOf('-'); + return { + string: arg, + numbers: (indexOfDash === -1 ? arg : arg.substring(0, indexOfDash)).split('.').map(x => { + const value = Number(x); + if (Number.isNaN(value)) { + throw new TypeError(`${arg} is not a valid redis version`); + } - return value; - }); + return value; + }) + }; }) .demandOption(argumentName) .parseSync()[argumentName]; } + readonly #VERSION_NUMBERS: Array; readonly #DOCKER_IMAGE: RedisServerDockerConfig; constructor(config: TestUtilsConfig) { + const { string, numbers } = TestUtils.#getVersion(config.dockerImageVersionArgument, config.defaultDockerVersion); + this.#VERSION_NUMBERS = numbers; this.#DOCKER_IMAGE = { image: config.dockerImageName, - version: TestUtils.#getVersion(config.dockerImageVersionArgument, config.defaultDockerVersion) + version: string }; } isVersionGreaterThan(minimumVersion: Array | undefined): boolean { if (minimumVersion === undefined) return true; - const lastIndex = Math.min(this.#DOCKER_IMAGE.version.length, minimumVersion.length) - 1; + const lastIndex = Math.min(this.#VERSION_NUMBERS.length, minimumVersion.length) - 1; for (let i = 0; i < lastIndex; i++) { - if (this.#DOCKER_IMAGE.version[i] > minimumVersion[i]) { + if (this.#VERSION_NUMBERS[i] > minimumVersion[i]) { return true; - } else if (minimumVersion[i] > this.#DOCKER_IMAGE.version[i]) { + } else if (minimumVersion[i] > this.#VERSION_NUMBERS[i]) { return false; } } - return this.#DOCKER_IMAGE.version[lastIndex] >= minimumVersion[lastIndex]; + return this.#VERSION_NUMBERS[lastIndex] >= minimumVersion[lastIndex]; } isVersionGreaterThanHook(minimumVersion: Array | undefined): void { diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 263b4cccff..7d85418733 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -12,13 +12,13 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@types/mocha": "^9.1.0", - "@types/node": "^17.0.13", - "@types/yargs": "^17.0.8", - "mocha": "^9.2.0", + "@types/node": "^17.0.23", + "@types/yargs": "^17.0.10", + "mocha": "^9.2.2", "nyc": "^15.1.0", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typescript": "^4.5.5", - "yargs": "^17.3.1" + "ts-node": "^10.7.0", + "typescript": "^4.6.3", + "yargs": "^17.4.0" } } diff --git a/packages/time-series/package.json b/packages/time-series/package.json index 8891fe61f2..034cb56c3a 100644 --- a/packages/time-series/package.json +++ b/packages/time-series/package.json @@ -18,12 +18,12 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.2", "@node-redis/test-utils": "*", - "@types/node": "^17.0.13", + "@types/node": "^17.0.23", "nyc": "^15.1.0", - "release-it": "^14.12.4", + "release-it": "^14.13.1", "source-map-support": "^0.5.21", - "ts-node": "^10.4.0", - "typedoc": "^0.22.11", - "typescript": "^4.5.5" + "ts-node": "^10.7.0", + "typedoc": "^0.22.13", + "typescript": "^4.6.3" } }