diff --git a/Dockerfile.express b/Dockerfile.express index a4c129b1..56f35ebd 100644 --- a/Dockerfile.express +++ b/Dockerfile.express @@ -1,4 +1,4 @@ -FROM node:20.18.1-alpine3.20 +FROM node:24.1.0-alpine3.20 ENV BIND_HOST="0.0.0.0" diff --git a/Dockerfile.grenache-grape b/Dockerfile.grenache-grape index 233aa845..0bf325cb 100644 --- a/Dockerfile.grenache-grape +++ b/Dockerfile.grenache-grape @@ -1,4 +1,4 @@ -FROM node:20.18.1-alpine3.20 +FROM node:24.1.0-alpine3.20 ENV BIND_HOST="0.0.0.0" diff --git a/Dockerfile.ui-builder b/Dockerfile.ui-builder index 0e6f3f70..db05df78 100644 --- a/Dockerfile.ui-builder +++ b/Dockerfile.ui-builder @@ -1,4 +1,4 @@ -FROM node:20.18.1-alpine3.20 +FROM node:24.1.0-alpine3.20 WORKDIR /home/node/bfx-report-ui diff --git a/Dockerfile.worker b/Dockerfile.worker index 4c0a3891..c65f8c5d 100644 --- a/Dockerfile.worker +++ b/Dockerfile.worker @@ -1,4 +1,4 @@ -FROM node:20.18.1-alpine3.20 +FROM node:24.1.0-alpine3.20 ARG GRC_VER="0.8.2" diff --git a/bfx-report-ui b/bfx-report-ui index 078a7037..5115ed35 160000 --- a/bfx-report-ui +++ b/bfx-report-ui @@ -1 +1 @@ -Subproject commit 078a70373b3d31d8d637e1713f0f8d141d4739ca +Subproject commit 5115ed35a457cc82e5f63db8115e297e50863917 diff --git a/locales/pt-BR/pdf.json b/locales/pt-BR/pdf.json deleted file mode 100644 index 7f5a222a..00000000 --- a/locales/pt-BR/pdf.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "template": { - "startingPositionsSnapshot": "Captura das posições iniciais", - "endingPositionsSnapshot": "Captura das posições finais", - "finalState": "Estado final", - "startingPeriodBalances": "Saldos no início do período", - "movementsDetails": "Detalhes das movimentações", - "endingPeriodBalances": "Saldos no final do período", - "positions": "Posições", - "wallets": "Carteiras", - "positionsTickers": "cotações das posições", - "walletsTickers": "cotações das Carteiras", - "delistedCcyMessageStart": "O relatório fiscal contém os seguintes tokens removidos da lista:", - "delistedCcyMessageEnd": "Esses tokens não possuem mais histórico de negociações disponível publicamente, o que torna o relatório impreciso. Por favor, verifique todos os valores de forma independente ou com um consultor fiscal certificado." - } -} diff --git a/package-lock.json b/package-lock.json index 3a7b30bf..8f15c726 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bitfinex/bfx-reports-framework", - "version": "5.3.0", + "version": "5.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@bitfinex/bfx-reports-framework", - "version": "5.3.0", + "version": "5.4.0", "license": "Apache-2.0", "dependencies": { "@bitfinex/bfx-facs-db-better-sqlite": "git+https://github.com/bitfinexcom/bfx-facs-db-better-sqlite.git", @@ -17,18 +17,18 @@ "bignumber.js": "9.1.2", "csv": "5.5.3", "grenache-nodejs-ws": "1.0.0", - "inversify": "6.0.1", + "inversify": "7.11.0", "mathjs": "14.8.1", "moment": "2.29.4", "puppeteer": "24.1.0", - "uuid": "9.0.0", + "uuid": "11.1.0", "yargs": "17.2.1" }, "devDependencies": { "@bitfinex/bfx-report-express": "git+https://github.com/bitfinexcom/bfx-report-express.git", "bfx-api-mock-srv": "2.0.0", "chai": "4.3.4", - "concurrently": "9.2.1", + "concurrently": "10.0.4", "cross-env": "10.1.0", "grenache-grape": "1.0.0", "mocha": "11.1.0", @@ -37,7 +37,7 @@ "supertest": "7.1.0" }, "engines": { - "node": ">=20.18.1" + "node": ">=22" } }, "node_modules/@babel/code-frame": { @@ -134,16 +134,16 @@ } }, "node_modules/@bitfinex/bfx-facs-db-better-sqlite": { - "version": "2.1.1", - "resolved": "git+ssh://git@github.com/bitfinexcom/bfx-facs-db-better-sqlite.git#c0c129a39ae52200575052091750a16d43e772cc", + "version": "3.0.0", + "resolved": "git+ssh://git@github.com/bitfinexcom/bfx-facs-db-better-sqlite.git#1909d26a936fafd1f61565df6dc98d3802396d1a", "license": "Apache-2.0", "dependencies": { "@bitfinex/bfx-facs-base": "git+https://github.com/bitfinexcom/bfx-facs-base.git", "async": "3.2.4", - "better-sqlite3": "12.6.2" + "better-sqlite3": "13.0.1" }, "engines": { - "node": ">=20.18.1" + "node": ">=22" } }, "node_modules/@bitfinex/bfx-facs-deflate": { @@ -222,7 +222,7 @@ }, "node_modules/@bitfinex/bfx-facs-scheduler": { "version": "1.0.0", - "resolved": "git+ssh://git@github.com/bitfinexcom/bfx-facs-scheduler.git#b7b3f86bc4be45599d7870d6f75a04fecd3f3e02", + "resolved": "git+ssh://git@github.com/bitfinexcom/bfx-facs-scheduler.git#404efe844e939b896466f8eaa51050b873dc256d", "license": "Apache-2.0", "dependencies": { "@bitfinex/bfx-facs-base": "git+https://github.com/bitfinexcom/bfx-facs-base.git", @@ -234,8 +234,8 @@ } }, "node_modules/@bitfinex/bfx-report": { - "version": "5.2.2", - "resolved": "git+ssh://git@github.com/bitfinexcom/bfx-report.git#83ab7eed8a44361a94205a8e7895d03b3e61cc07", + "version": "5.3.0", + "resolved": "git+ssh://git@github.com/bitfinexcom/bfx-report.git#69c7bb9f7a08ff46d1da2e4693af1012cfd2b4ab", "license": "Apache-2.0", "dependencies": { "@bitfinex/bfx-facs-deflate": "git+https://github.com/bitfinexcom/bfx-facs-deflate.git", @@ -247,25 +247,25 @@ "ajv": "8.18.0", "ajv-formats": "3.0.1", "async": "3.2.4", - "bitfinex-api-node": "7.0.0", + "bitfinex-api-node": "9.1.0", "colors": "1.4.0", "csv": "5.5.3", "i18next": "23.15.1", - "i18next-fs-backend": "2.3.2", - "inversify": "6.0.1", + "i18next-fs-backend": "2.6.7", + "inversify": "7.11.0", "lru": "3.1.0", "moment": "2.29.4", "moment-timezone": "0.5.39", "pug": "3.0.3", - "reflect-metadata": "0.1.13", + "reflect-metadata": "0.2.2", "triple-beam": "1.3.0", - "uuid": "9.0.0", + "uuid": "11.1.0", "winston": "3.18.3", "winston-transport": "4.9.0", "yargs": "17.2.1" }, "engines": { - "node": ">=20.18.1" + "node": ">=22" } }, "node_modules/@bitfinex/bfx-report-express": { @@ -336,11 +336,11 @@ } }, "node_modules/@bitfinex/bfx-svc-boot-js": { - "version": "1.1.0", - "resolved": "git+ssh://git@github.com/bitfinexcom/bfx-svc-boot-js.git#be28ca5387eef34e651042e64d278feedf9b3a61", + "version": "1.3.1", + "resolved": "git+ssh://git@github.com/bitfinexcom/bfx-svc-boot-js.git#c9217dadefeb194cc77d79cba5666b61eb7310d9", "license": "Apache-2.0", "dependencies": { - "lodash": "^4.17.21", + "lodash": "^4.18.1", "yargs": "^17.2.1" } }, @@ -372,8 +372,8 @@ } }, "node_modules/@bitfinex/lib-js-util-base": { - "version": "2.0.2", - "resolved": "git+ssh://git@github.com/bitfinexcom/lib-js-util-base.git#e915c19224d8e334b3260ae3e979a50865722446", + "version": "2.1.0", + "resolved": "git+ssh://git@github.com/bitfinexcom/lib-js-util-base.git#8ac3d64c460f9468dc885f87a33251fd9f1e640f", "license": "MIT" }, "node_modules/@bitfinexcom/lib-js-util-base": { @@ -524,6 +524,47 @@ "deprecated": "Use @eslint/object-schema instead", "dev": true }, + "node_modules/@inversifyjs/common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@inversifyjs/common/-/common-1.5.2.tgz", + "integrity": "sha512-WlzR9xGadABS9gtgZQ+luoZ8V6qm4Ii6RQfcfC9Ho2SOlE6ZuemFo7PKJvKI0ikm8cmKbU8hw5UK6E4qovH21w==", + "license": "MIT" + }, + "node_modules/@inversifyjs/core": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@inversifyjs/core/-/core-9.2.0.tgz", + "integrity": "sha512-Nm7BR6KmpgshIHpVQWuEDehqRVb6GBm8LFEuhc2s4kSZWrArZ15RmXQzROLk4m+hkj4kMXgvMm5Qbopot/D6Sg==", + "license": "MIT", + "dependencies": { + "@inversifyjs/common": "1.5.2", + "@inversifyjs/prototype-utils": "0.1.3", + "@inversifyjs/reflect-metadata-utils": "1.4.1" + } + }, + "node_modules/@inversifyjs/core/node_modules/@inversifyjs/reflect-metadata-utils": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@inversifyjs/reflect-metadata-utils/-/reflect-metadata-utils-1.4.1.tgz", + "integrity": "sha512-Cp77C4d2wLaHXiUB7iH6Cxb7i1lD/YDuTIHLTDzKINqGSz0DCSoL/Dg2wVkW/6Qx03r/yQMLJ+32Agl32N2X8g==", + "license": "MIT", + "peerDependencies": { + "reflect-metadata": "~0.2.2" + } + }, + "node_modules/@inversifyjs/plugin": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@inversifyjs/plugin/-/plugin-0.2.0.tgz", + "integrity": "sha512-R/JAdkTSD819pV1zi0HP54mWHyX+H2m8SxldXRgPQarS3ySV4KPyRdosWcfB8Se0JJZWZLHYiUNiS6JvMWSPjw==", + "license": "MIT" + }, + "node_modules/@inversifyjs/prototype-utils": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@inversifyjs/prototype-utils/-/prototype-utils-0.1.3.tgz", + "integrity": "sha512-EzRamZzNgE9Sn3QtZ8NncNa2lpPMZfspqbK6BWFguWnOpK8ymp2TUuH46ruFHZhrHKnknPd7fG22ZV7iF517TQ==", + "license": "MIT", + "dependencies": { + "@inversifyjs/common": "1.5.2" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1417,17 +1458,16 @@ "dev": true }, "node_modules/better-sqlite3": { - "version": "12.6.2", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.6.2.tgz", - "integrity": "sha512-8VYKM3MjCa9WcaSAI3hzwhmyHVlH8tiGFwf0RlTsZPWJ1I5MkzjiudCo4KC4DxOaL/53A5B1sI/IbldNFDbsKA==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-13.0.1.tgz", + "integrity": "sha512-LYpmOXdkpQYf4wmlxkdzW01XGlOXNIbjLg45yNkh0FQ4814VbK9PdOFmhZpYbej+EZtR/i3FDdhEG98HqZdgnA==", "hasInstallScript": true, "license": "MIT", "dependencies": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.1" + "node-addon-api": "^8.0.0" }, "engines": { - "node": "20.x || 22.x || 23.x || 24.x || 25.x" + "node": ">=22" } }, "node_modules/bfx-api-mock-srv": { @@ -1447,13 +1487,13 @@ } }, "node_modules/bfx-api-node-models": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bfx-api-node-models/-/bfx-api-node-models-2.1.0.tgz", - "integrity": "sha512-S4C6xS6x/Vlds+8HOJFm+hG+LUzk1xnlUomHvMCHLf/96/J+B1iP3NMMt2D22jryvEgezE8tFptgN81CZWgK9Q==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bfx-api-node-models/-/bfx-api-node-models-2.1.3.tgz", + "integrity": "sha512-Cwd51n10o9jLy+pO1tIpKnS99+cKCSQhVWCtdXyzR3lP+QOmBl+2kESgC1WS3wOK5DD78EExeLWeurguWEN6Bw==", "license": "MIT", "dependencies": { "bfx-api-node-util": "^1.0.10", - "bfx-hf-util": "git+https://github.com/bitfinexcom/bfx-hf-util.git#v1.0.12", + "bfx-hf-util": "^1.0.11", "bluebird": "3.7.2", "crc-32": "1.2.0", "debug": "4.3.3", @@ -1487,12 +1527,12 @@ "license": "MIT" }, "node_modules/bfx-api-node-rest": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/bfx-api-node-rest/-/bfx-api-node-rest-6.0.0.tgz", - "integrity": "sha512-LaS5HuJ8hESIAtsfT4XhJlpCParc2wTduA6/U71Ysee+jO4PU91j3EGbqAyFLUJ6tTjwy24GIjqwByb4qZYZ5Q==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/bfx-api-node-rest/-/bfx-api-node-rest-8.1.1.tgz", + "integrity": "sha512-NPQSVt2Ad9OaOwpRSqfTKz8iYJKLNOyd1yeHnuTfM2ifhD0feqB78LGpTPE9o5gm88MpnG4urlEI+JgReAqQIQ==", "license": "MIT", "dependencies": { - "bfx-api-node-models": "^2.0.0", + "bfx-api-node-models": "^2.1.3", "bfx-api-node-util": "^1.0.10", "debug": "4.3.3", "dirty-chai": "^2.0.1", @@ -1500,7 +1540,7 @@ "node-fetch": "^2.6.9" }, "engines": { - "node": ">=8.3.0" + "node": ">=16.0.0" } }, "node_modules/bfx-api-node-rest/node_modules/debug": { @@ -1587,8 +1627,9 @@ } }, "node_modules/bfx-hf-util": { - "version": "1.0.12", - "resolved": "git+ssh://git@github.com/bitfinexcom/bfx-hf-util.git#82ce185e336d14c84037494e62e6c5d84434cdad", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/bfx-hf-util/-/bfx-hf-util-1.0.11.tgz", + "integrity": "sha512-q3BXuNNk6cNE/4h++xdHOBsPR9p43dzIxrsrHUD8gYDuWzoE0U73KZuOwFKZvwa5KGPfzZTG0YYckuuIZ7amag==", "license": "Apache-2.0", "dependencies": { "bluebird": "^3.7.2", @@ -1617,23 +1658,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "license": "MIT", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, "node_modules/bitfinex-api-node": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/bitfinex-api-node/-/bitfinex-api-node-7.0.0.tgz", - "integrity": "sha512-mK1WL2y+DxUGum41YM/h1LVVYSUBsxAiw21KgJG06+zbn5GIfvMHaVlOwecpGexLOoZUhtfddyFnwgzd5Qn2bQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/bitfinex-api-node/-/bitfinex-api-node-9.1.0.tgz", + "integrity": "sha512-zBbrGZaVTXL5qv/5DVWoMyVu+bS8ZuLulIVXzE9nozoG3b2MkfozzFyloSOOwHeEJ0hTuWqFfKKlX6ldAXTkPQ==", "license": "MIT", "dependencies": { "bfx-api-node-models": "^2.0.0", - "bfx-api-node-rest": "^6.0.0", + "bfx-api-node-rest": "^8.1.0", "bfx-api-node-util": "^1.0.12", "bfx-api-node-ws1": "^1.0.0", "bignumber.js": "9.0.0", @@ -2053,12 +2085,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" - }, "node_modules/chrome-dgram": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/chrome-dgram/-/chrome-dgram-3.0.6.tgz", @@ -2310,62 +2336,182 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concurrently": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", - "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-10.0.4.tgz", + "integrity": "sha512-trZql+7l/0+WRAsAnEdctr4+iiOS6ZrViI6H8QWcCF9MFS/LT0dKpe8vluB1to6it+OxSI4VospFTIFMW8DJRw==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "4.1.2", + "chalk": "5.6.2", "rxjs": "7.8.2", - "shell-quote": "1.8.3", - "supports-color": "8.1.1", + "shell-quote": "1.9.0", + "supports-color": "10.2.2", "tree-kill": "1.2.2", - "yargs": "17.7.2" + "yargs": "18.0.0" }, "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" + "conc": "dist/bin/index.js", + "concurrently": "dist/bin/index.js" }, "engines": { - "node": ">=18" + "node": ">=22" }, "funding": { "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, + "node_modules/concurrently/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/concurrently/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "dev": true, "license": "ISC", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/concurrently/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/concurrently/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concurrently/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/concurrently/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "dev": true, "license": "MIT", "dependencies": { - "cliui": "^8.0.1", + "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", + "string-width": "^7.2.0", "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "yargs-parser": "^22.0.0" }, "engines": { - "node": ">=12" + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/concurrently/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/config": { @@ -2687,21 +2833,6 @@ "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", "license": "MIT" }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", @@ -2713,15 +2844,6 @@ "node": ">=0.12" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2801,15 +2923,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, "node_modules/devtools-protocol": { "version": "0.0.1380148", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1380148.tgz", @@ -3722,15 +3835,6 @@ "node": ">=0.8" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "license": "(MIT OR WTFPL)", - "engines": { - "node": ">=6" - } - }, "node_modules/express": { "version": "4.22.1", "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", @@ -3890,12 +3994,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "license": "MIT" - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -4158,6 +4256,19 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-func-name": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", @@ -4257,12 +4368,6 @@ "node": ">= 14" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT" - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -4445,19 +4550,6 @@ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "license": "MIT" }, - "node_modules/grenache-nodejs-base/node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, "node_modules/grenache-nodejs-http": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/grenache-nodejs-http/-/grenache-nodejs-http-1.0.1.tgz", @@ -4500,19 +4592,6 @@ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "license": "MIT" }, - "node_modules/grenache-nodejs-link/node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, "node_modules/grenache-nodejs-ws": { "version": "1.0.0", "resolved": "git+ssh://git@github.com/bitfinexcom/grenache-nodejs-ws.git#7b12c0b450fa44f2502ae1d21770186b273bbecc", @@ -4528,19 +4607,6 @@ "node": ">=16.0" } }, - "node_modules/grenache-nodejs-ws/node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -4697,9 +4763,9 @@ } }, "node_modules/i18next-fs-backend": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/i18next-fs-backend/-/i18next-fs-backend-2.3.2.tgz", - "integrity": "sha512-LIwUlkqDZnUI8lnUxBnEj8K/FrHQTT/Sc+1rvDm9E8YvvY5YxzoEAASNx+W5M9DfD5s77lI5vSAFWeTp26B/3Q==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/i18next-fs-backend/-/i18next-fs-backend-2.6.7.tgz", + "integrity": "sha512-nN2TIycyR/d+OVuLm1ugPyOlMprqPRnQ7QktBgn44F3H8l7TeTH4ffHJ7nUsd4QVJfetWW7/VZ3s+4g7FoAZUA==", "license": "MIT" }, "node_modules/iconv-lite": { @@ -4799,12 +4865,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -4820,9 +4880,39 @@ } }, "node_modules/inversify": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/inversify/-/inversify-6.0.1.tgz", - "integrity": "sha512-B3ex30927698TJENHR++8FfEaJGqoWOgI6ZY5Ht/nLUsFCwHn6akbwtnUAPCgUepAnTpe2qHxhDNjoKLyz6rgQ==" + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/inversify/-/inversify-7.11.0.tgz", + "integrity": "sha512-yZDprSSr8TyVeMGI/AOV4ws6gwjX22hj9Z8/oHAVpJORY6WRFTcUzhnZtibBUHEw2U8ArvHcR+i863DplQ3Cwg==", + "license": "MIT", + "dependencies": { + "@inversifyjs/common": "1.5.2", + "@inversifyjs/container": "1.15.0", + "@inversifyjs/core": "9.2.0" + } + }, + "node_modules/inversify/node_modules/@inversifyjs/container": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@inversifyjs/container/-/container-1.15.0.tgz", + "integrity": "sha512-U2xYsPrJTz5za2TExi5lg8qOWf8TEVBpN+pQM7B8BVA2rajtbRE9A66SLRHk8c1eGXmg+0K4Hdki6tWAsSQBUA==", + "license": "MIT", + "dependencies": { + "@inversifyjs/common": "1.5.2", + "@inversifyjs/core": "9.2.0", + "@inversifyjs/plugin": "0.2.0", + "@inversifyjs/reflect-metadata-utils": "1.4.1" + }, + "peerDependencies": { + "reflect-metadata": "~0.2.2" + } + }, + "node_modules/inversify/node_modules/@inversifyjs/reflect-metadata-utils": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@inversifyjs/reflect-metadata-utils/-/reflect-metadata-utils-1.4.1.tgz", + "integrity": "sha512-Cp77C4d2wLaHXiUB7iH6Cxb7i1lD/YDuTIHLTDzKINqGSz0DCSoL/Dg2wVkW/6Qx03r/yQMLJ+32Agl32N2X8g==", + "license": "MIT", + "peerDependencies": { + "reflect-metadata": "~0.2.2" + } }, "node_modules/ip-address": { "version": "9.0.5", @@ -5901,18 +5991,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", @@ -5929,6 +6007,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5955,12 +6034,6 @@ "node": ">= 8.0.0" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT" - }, "node_modules/mocha": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.1.0.tgz", @@ -6161,12 +6234,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "license": "MIT" - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -6190,16 +6257,13 @@ "node": ">= 0.4.0" } }, - "node_modules/node-abi": { - "version": "3.89.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.89.0.tgz", - "integrity": "sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==", + "node_modules/node-addon-api": { + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.9.1.tgz", + "integrity": "sha512-4eUQWVPCUUUiBjLnHS3cXWeC6ryoPUc0U3rP7IuzapoGbzMqd/r6KKO0clr0b+snQhsrueFEhCZDdK+LK7hxKg==", "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, "engines": { - "node": ">=10" + "node": "^18 || ^20 || >= 21" } }, "node_modules/node-fetch": { @@ -6811,33 +6875,6 @@ "node": ">= 0.4" } }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", - "license": "MIT", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -7234,30 +7271,6 @@ "node": ">= 0.8" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -7300,9 +7313,9 @@ } }, "node_modules/reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", "license": "Apache-2.0" }, "node_modules/reflect.getprototypeof": { @@ -7742,9 +7755,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz", + "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==", "dev": true, "license": "MIT", "engines": { @@ -7838,51 +7851,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/simple-sha1": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/simple-sha1/-/simple-sha1-3.1.0.tgz", @@ -8325,18 +8293,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, "node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", @@ -8468,18 +8424,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -8691,11 +8635,16 @@ } }, "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist/esm/bin/uuid" } }, "node_modules/vary": { diff --git a/package.json b/package.json index 4cd039f6..e2a5a09d 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { "name": "@bitfinex/bfx-reports-framework", - "version": "5.3.0", + "version": "5.4.0", "description": "Bitfinex reports framework", "main": "worker.js", "engines": { - "node": ">=20.18.1" + "node": ">=22" }, "license": "Apache-2.0", "dependencies": { @@ -16,18 +16,18 @@ "bignumber.js": "9.1.2", "csv": "5.5.3", "grenache-nodejs-ws": "1.0.0", - "inversify": "6.0.1", + "inversify": "7.11.0", "mathjs": "14.8.1", "moment": "2.29.4", "puppeteer": "24.1.0", - "uuid": "9.0.0", + "uuid": "11.1.0", "yargs": "17.2.1" }, "devDependencies": { "@bitfinex/bfx-report-express": "git+https://github.com/bitfinexcom/bfx-report-express.git", "bfx-api-mock-srv": "2.0.0", "chai": "4.3.4", - "concurrently": "9.2.1", + "concurrently": "10.0.4", "cross-env": "10.1.0", "grenache-grape": "1.0.0", "mocha": "11.1.0", diff --git a/test/test-cases/additional-api-sync-mode-sqlite-test-cases.js b/test/test-cases/additional-api-sync-mode-sqlite-test-cases.js index f95ce821..1e93ca78 100644 --- a/test/test-cases/additional-api-sync-mode-sqlite-test-cases.js +++ b/test/test-cases/additional-api-sync-mode-sqlite-test-cases.js @@ -1271,11 +1271,6 @@ module.exports = ( it('it should be successfully performed by the getWeightedAveragesReportFile method', async function () { this.timeout(60000) - // TODO: Wait for implementation of pdf template in the next release - if (isPDFRequired) { - this.skip() - } - const procPromise = queueToPromise(params.processorQueue) const aggrPromise = queueToPromise(params.aggregatorQueue) diff --git a/test/test-cases/api-sync-mode-sqlite-test-cases.js b/test/test-cases/api-sync-mode-sqlite-test-cases.js index d41baded..fc7e55f7 100644 --- a/test/test-cases/api-sync-mode-sqlite-test-cases.js +++ b/test/test-cases/api-sync-mode-sqlite-test-cases.js @@ -1458,6 +1458,37 @@ module.exports = ( }) }) + it('it should be successfully performed by the getLedgers method filtered by wallet', async function () { + this.timeout(5000) + + const res = await agent + .post(`${basePath}/json-rpc`) + .type('json') + .send({ + auth, + method: 'getLedgers', + params: { + wallet: 'exchange', + start: 0, + end, + limit: 2 + }, + id: 5 + }) + .expect('Content-Type', /json/) + .expect(200) + + assert.isObject(res.body) + assert.propertyVal(res.body, 'id', 5) + assert.isObject(res.body.result) + assert.isArray(res.body.result.res) + + for (const resItem of res.body.result.res) { + assert.isObject(resItem) + assert.deepEqual(resItem.wallet, 'exchange') + } + }) + it('it should be successfully performed by the getLedgers method, without params', async function () { this.timeout(5000) diff --git a/workers/api.framework.report.wrk.js b/workers/api.framework.report.wrk.js index e21646ca..e1a610f4 100644 --- a/workers/api.framework.report.wrk.js +++ b/workers/api.framework.report.wrk.js @@ -67,7 +67,7 @@ class WrkReportFrameWorkApi extends WrkReportServiceApi { const _appDeps = appDeps(...args) this.appDeps.push(_appDeps) - this.container.load(_appDeps) + this.container.loadSync(_appDeps) } getGrcConf () { @@ -210,6 +210,14 @@ class WrkReportFrameWorkApi extends WrkReportServiceApi { const processMessageManager = this.container.get(TYPES.ProcessMessageManager) await wsTransport.start() + const emitReportFileGenFailedToOne = (e, job) => { + wsEventEmitter.emitReportFileGenerationFailedToOne( + { reportFilesMetadata: null }, + job?.data?.userInfo + ).then(() => {}, (err) => { + this.logger.error(`WS_EVENT_EMITTER:REPORT_FILE_FAILED: ${err.stack || err}`) + }) + } processorQueue.on(QUEUE_EVENT_NAMES.ERROR_BASE, (err, job) => { if ( @@ -219,13 +227,12 @@ class WrkReportFrameWorkApi extends WrkReportServiceApi { return } - wsEventEmitter.emitReportFileGenerationFailedToOne( - { reportFilesMetadata: null }, - job?.data?.userInfo - ).then(() => {}, (err) => { - this.logger.error(`WS_EVENT_EMITTER:REPORT_FILE_FAILED: ${err.stack || err}`) - }) + emitReportFileGenFailedToOne(err, job) }) + aggregatorQueue.on( + QUEUE_EVENT_NAMES.ERROR_BASE, + emitReportFileGenFailedToOne + ) aggregatorQueue.on(QUEUE_EVENT_NAMES.COMPLETED, (res) => { const { reportFilesMetadata, diff --git a/workers/loc.api/di/app.deps.js b/workers/loc.api/di/app.deps.js index f801e639..13459295 100644 --- a/workers/loc.api/di/app.deps.js +++ b/workers/loc.api/di/app.deps.js @@ -130,7 +130,7 @@ decorate(injectable(), EventEmitter) module.exports = ({ grcBfxOpts }) => { - return new ContainerModule((bind, unbind, isBound, rebind) => { + return new ContainerModule(({ bind, rebindSync }) => { bind(TYPES.FrameworkRServiceDepsSchema) .toDynamicValue((ctx) => { return [ @@ -173,14 +173,14 @@ module.exports = ({ ['_wsEventEmitterFactory', TYPES.WSEventEmitterFactory] ] }) - rebind(TYPES.RServiceDepsSchemaAliase) + rebindSync(TYPES.RServiceDepsSchemaAliase) .toDynamicValue((ctx) => [ - ...ctx.container.get(TYPES.RServiceDepsSchema), - ...ctx.container.get(TYPES.FrameworkRServiceDepsSchema) + ...ctx.get(TYPES.RServiceDepsSchema), + ...ctx.get(TYPES.FrameworkRServiceDepsSchema) ]) bind(TYPES.WSEventEmitterFactory) .toFactory(wsEventEmitterFactory) - rebind(TYPES.Responder).toConstantValue( + rebindSync(TYPES.Responder).toConstantValue( bindDepsToFn( responder, [ @@ -190,7 +190,7 @@ module.exports = ({ ] ) ) - rebind(TYPES.PdfWriter) + rebindSync(TYPES.PdfWriter) .to(PdfWriter) .inSingletonScope() bind(TYPES.PrivResponder) @@ -256,10 +256,10 @@ module.exports = ({ .toFactory(dbMigratorFactory) bind(TYPES.DB) .toDynamicValue((ctx) => { - const { dbDriver } = ctx.container.get( + const { dbDriver } = ctx.get( TYPES.CONF ) - const rService = ctx.container.get( + const rService = ctx.get( TYPES.RService ) @@ -271,12 +271,12 @@ module.exports = ({ .to(BetterSqliteDAO) bind(TYPES.DAO) .toDynamicValue((ctx) => { - const { dbDriver } = ctx.container.get( + const { dbDriver } = ctx.get( TYPES.CONF ) if (dbDriver === 'better-sqlite') { - return ctx.container.get( + return ctx.get( TYPES.BetterSqliteDAO ) } @@ -416,12 +416,12 @@ module.exports = ({ bind(TYPES.TransactionTaxReport) .to(TransactionTaxReport) .inSingletonScope() - rebind(TYPES.WeightedAveragesReport) + rebindSync(TYPES.WeightedAveragesReport) .to(WeightedAveragesReport) - rebind(TYPES.ReportFileJobData) + rebindSync(TYPES.ReportFileJobData) .to(ReportFileJobData) .inSingletonScope() - rebind(TYPES.GetDataFromApi).toConstantValue( + rebindSync(TYPES.GetDataFromApi).toConstantValue( bindDepsToFn( getDataFromApi, [ @@ -430,10 +430,10 @@ module.exports = ({ ] ) ) - rebind(TYPES.BfxApiRouter) + rebindSync(TYPES.BfxApiRouter) .to(BfxApiRouter) .inSingletonScope() - rebind(TYPES.GetREST).toConstantValue( + rebindSync(TYPES.GetREST).toConstantValue( bindDepsToFn( getREST, [ @@ -442,7 +442,7 @@ module.exports = ({ ] ) ) - rebind(TYPES.PrepareApiResponse).toConstantValue( + rebindSync(TYPES.PrepareApiResponse).toConstantValue( bindDepsToFn( prepareApiResponse, [ diff --git a/workers/loc.api/di/factories/data-inserter-factory.js b/workers/loc.api/di/factories/data-inserter-factory.js index ec2c96f7..c3629b02 100644 --- a/workers/loc.api/di/factories/data-inserter-factory.js +++ b/workers/loc.api/di/factories/data-inserter-factory.js @@ -4,7 +4,7 @@ const TYPES = require('../types') module.exports = (ctx) => { return (params) => { - const dataInserter = ctx.container.get( + const dataInserter = ctx.get( TYPES.DataInserter ) dataInserter.init(params) diff --git a/workers/loc.api/di/factories/db-migrator-factory.js b/workers/loc.api/di/factories/db-migrator-factory.js index af7b3f12..d28de1ea 100644 --- a/workers/loc.api/di/factories/db-migrator-factory.js +++ b/workers/loc.api/di/factories/db-migrator-factory.js @@ -3,17 +3,17 @@ const TYPES = require('../types') module.exports = (ctx) => { - const { dbDriver } = ctx.container.get( + const { dbDriver } = ctx.get( TYPES.CONF ) return () => { - const dao = ctx.container.get( + const dao = ctx.get( TYPES.DAO ) if (dbDriver === 'better-sqlite') { - const sqliteDbMigrator = ctx.container.get( + const sqliteDbMigrator = ctx.get( TYPES.SqliteDbMigrator ) sqliteDbMigrator.setDao(dao) diff --git a/workers/loc.api/di/factories/helpers/get-migration-file-metadata.js b/workers/loc.api/di/factories/helpers/get-migration-file-metadata.js index 02db0c6b..311ebb8f 100644 --- a/workers/loc.api/di/factories/helpers/get-migration-file-metadata.js +++ b/workers/loc.api/di/factories/helpers/get-migration-file-metadata.js @@ -1,6 +1,8 @@ 'use strict' -const { orderBy } = require('../../../helpers') +const { + orderBy +} = require('@bitfinex/lib-js-util-base') module.exports = (migrationFileDirents) => { const metadata = migrationFileDirents.reduce((accum, dirent) => { diff --git a/workers/loc.api/di/factories/interrupter-factory.js b/workers/loc.api/di/factories/interrupter-factory.js index f927510f..813f435b 100644 --- a/workers/loc.api/di/factories/interrupter-factory.js +++ b/workers/loc.api/di/factories/interrupter-factory.js @@ -7,7 +7,7 @@ const { const TYPES = require('../types') module.exports = (ctx) => { - const authenticator = ctx.container.get(TYPES.Authenticator) + const authenticator = ctx.get(TYPES.Authenticator) return (params) => { const { user, name } = params ?? {} @@ -16,7 +16,7 @@ module.exports = (ctx) => { throw new AuthError() } - const interrupter = ctx.container.get( + const interrupter = ctx.get( TYPES.Interrupter ).setName(name) diff --git a/workers/loc.api/di/factories/migrations-factory.js b/workers/loc.api/di/factories/migrations-factory.js index 0bb5bb60..e94c249e 100644 --- a/workers/loc.api/di/factories/migrations-factory.js +++ b/workers/loc.api/di/factories/migrations-factory.js @@ -45,13 +45,13 @@ const _lookUpMigrations = ( } module.exports = (ctx) => { - const { dbDriver } = ctx.container.get( + const { dbDriver } = ctx.get( TYPES.CONF ) - const logger = ctx.container.get( + const logger = ctx.get( TYPES.Logger ) - const processMessageManager = ctx.container.get( + const processMessageManager = ctx.get( TYPES.ProcessMessageManager ) @@ -71,7 +71,7 @@ module.exports = (ctx) => { TYPES.ProcessMessageManager ] const deps = depTypes.map((type) => { - return ctx.container.get(type) + return ctx.get(type) }) const migrationFileDirents = fs.readdirSync( diff --git a/workers/loc.api/di/factories/process-message-manager-factory.js b/workers/loc.api/di/factories/process-message-manager-factory.js index f007ca86..6a3a3ffa 100644 --- a/workers/loc.api/di/factories/process-message-manager-factory.js +++ b/workers/loc.api/di/factories/process-message-manager-factory.js @@ -3,7 +3,7 @@ const TYPES = require('../types') module.exports = (ctx) => { - const { dbDriver } = ctx.container.get( + const { dbDriver } = ctx.get( TYPES.CONF ) @@ -14,11 +14,11 @@ module.exports = (ctx) => { TYPES.RecalcSubAccountLedgersBalancesHook ] const deps = depTypes.map((type) => { - return ctx.container.get(type) + return ctx.get(type) }) if (dbDriver === 'better-sqlite') { - const processMessageManager = ctx.container.get( + const processMessageManager = ctx.get( TYPES.ProcessMessageManager ) processMessageManager.setDeps(...deps) diff --git a/workers/loc.api/di/factories/sync-factory.js b/workers/loc.api/di/factories/sync-factory.js index 14562293..65cddd2e 100755 --- a/workers/loc.api/di/factories/sync-factory.js +++ b/workers/loc.api/di/factories/sync-factory.js @@ -4,7 +4,7 @@ const TYPES = require('../types') module.exports = (ctx) => { return () => { - const sync = ctx.container.get( + const sync = ctx.get( TYPES.Sync ) diff --git a/workers/loc.api/di/factories/sync-user-step-data-factory.js b/workers/loc.api/di/factories/sync-user-step-data-factory.js index 99cdd3a8..434b98dc 100644 --- a/workers/loc.api/di/factories/sync-user-step-data-factory.js +++ b/workers/loc.api/di/factories/sync-user-step-data-factory.js @@ -4,7 +4,7 @@ const TYPES = require('../types') module.exports = (ctx) => { return (...args) => { - const syncUserStepData = ctx.container.get( + const syncUserStepData = ctx.get( TYPES.SyncUserStepData ) diff --git a/workers/loc.api/di/factories/ws-event-emitter-factory.js b/workers/loc.api/di/factories/ws-event-emitter-factory.js index 2ebcc92b..c8fd2e9a 100755 --- a/workers/loc.api/di/factories/ws-event-emitter-factory.js +++ b/workers/loc.api/di/factories/ws-event-emitter-factory.js @@ -4,7 +4,7 @@ const TYPES = require('../types') module.exports = (ctx) => { return () => { - const wsEventEmitter = ctx.container.get( + const wsEventEmitter = ctx.get( TYPES.WSEventEmitter ) diff --git a/workers/loc.api/helpers/index.js b/workers/loc.api/helpers/index.js index 88e55a20..0c475165 100644 --- a/workers/loc.api/helpers/index.js +++ b/workers/loc.api/helpers/index.js @@ -11,8 +11,7 @@ const { sumAllObjectsNumbers, pickAllLowerObjectsNumbers, sumArrayVolumes, - pushLargeArr, - orderBy + pushLargeArr } = require('./utils') const { isSubAccountApiKeys, @@ -36,6 +35,5 @@ module.exports = { pickAllLowerObjectsNumbers, sumArrayVolumes, pushLargeArr, - orderBy, isBfxApiStaging } diff --git a/workers/loc.api/helpers/utils/__test__/order-by.spec.js b/workers/loc.api/helpers/utils/__test__/order-by.spec.js deleted file mode 100644 index 8dfa2ac3..00000000 --- a/workers/loc.api/helpers/utils/__test__/order-by.spec.js +++ /dev/null @@ -1,350 +0,0 @@ -'use strict' - -const { assert } = require('chai') - -const orderBy = require('../order-by') - -describe('orderBy util', () => { - it('Order array of objects by name prop in desc', () => { - const mockedArr = [ - { name: 'aaa' }, - { name: 'www' }, - { name: 'bbb' }, - { name: 'yyy' } - ] - - const orderedArr = orderBy(mockedArr, ['name'], ['desc']) - - assert.deepStrictEqual(orderedArr, [ - { name: 'yyy' }, - { name: 'www' }, - { name: 'bbb' }, - { name: 'aaa' } - ]) - }) - - it('Order array of objects by name prop in asc', () => { - const mockedArr = [ - { name: 'aaa' }, - { name: 'www' }, - { name: 'bbb' }, - { name: 'yyy' } - ] - - const orderedArr = orderBy(mockedArr, ['name'], ['asc']) - - assert.deepStrictEqual(orderedArr, [ - { name: 'aaa' }, - { name: 'bbb' }, - { name: 'www' }, - { name: 'yyy' } - ]) - }) - - it('Order array of objects by name and value props in desc and asc', () => { - const mockedArr = [ - { name: 'aaa', value: 't' }, - { name: 'www', value: 'b' }, - { name: 'bbb', value: 'f' }, - { name: 'www', value: 'a' }, - { name: 'yyy' } - ] - - const orderedArr = orderBy( - mockedArr, - ['name', 'value'], - ['desc', 'asc'] - ) - - assert.deepStrictEqual(orderedArr, [ - { name: 'yyy' }, - { name: 'www', value: 'a' }, - { name: 'www', value: 'b' }, - { name: 'bbb', value: 'f' }, - { name: 'aaa', value: 't' } - ]) - }) - - it('Order array of objects by name and value props in asc by default', () => { - const mockedArr = [ - { name: 'aaa', value: 't' }, - { name: 'www', value: 'b' }, - { name: 'bbb', value: 'f' }, - { name: 'www', value: 'a' }, - { name: 'yyy' } - ] - - const orderedArr = orderBy( - mockedArr, - ['name', 'value'] - ) - - assert.deepStrictEqual(orderedArr, [ - { name: 'aaa', value: 't' }, - { name: 'bbb', value: 'f' }, - { name: 'www', value: 'a' }, - { name: 'www', value: 'b' }, - { name: 'yyy' } - ]) - }) - - it('Order array of objects by name prop in desc using dot syntax', () => { - const mockedArr = [ - { nestedObj: { name: 'aaa' } }, - { nestedObj: { name: 'www' } }, - { nestedObj: { name: 'bbb' } }, - { nestedObj: { name: 'yyy' } } - ] - - const orderedArr = orderBy( - mockedArr, - ['nestedObj.name'], - ['desc'] - ) - - assert.deepStrictEqual(orderedArr, [ - { nestedObj: { name: 'yyy' } }, - { nestedObj: { name: 'www' } }, - { nestedObj: { name: 'bbb' } }, - { nestedObj: { name: 'aaa' } } - ]) - }) - - it('Order array of objects by second item of array in desc using fn', () => { - const mockedArr = [ - { nestedObj: { arr: [0, 'aaa'] } }, - { nestedObj: { arr: [0, 'www'] } }, - { nestedObj: { arr: [0, 'bbb'] } }, - { nestedObj: { arr: [0, 'yyy'] } } - ] - - const orderedArr = orderBy( - mockedArr, - [(item) => item?.nestedObj?.arr?.[1]], - ['desc'] - ) - - assert.deepStrictEqual(orderedArr, [ - { nestedObj: { arr: [0, 'yyy'] } }, - { nestedObj: { arr: [0, 'www'] } }, - { nestedObj: { arr: [0, 'bbb'] } }, - { nestedObj: { arr: [0, 'aaa'] } } - ]) - }) - - it('Order array of array by index in desc', () => { - const mockedArr = [ - ['name', 'aaa'], - ['name', 'www'], - ['name', 'bbb'], - ['name', 'yyy'] - ] - - const orderedArr = orderBy(mockedArr, [1], ['desc']) - - assert.deepStrictEqual(orderedArr, [ - ['name', 'yyy'], - ['name', 'www'], - ['name', 'bbb'], - ['name', 'aaa'] - ]) - }) - - it('Order array by index in desc', () => { - const mockedArr = ['aaa', 'www', 'bbb', 'yyy'] - - const orderedArr = orderBy(mockedArr, [(item) => item], ['desc']) - - assert.deepStrictEqual(orderedArr, ['yyy', 'www', 'bbb', 'aaa']) - }) - - it('Order iterable object (Set) of objects by name prop in desc', () => { - const mockedSet = new Set([ - { name: 'aaa' }, - { name: 'www' }, - { name: 'bbb' }, - { name: 'yyy' } - ]) - - const orderedArr = orderBy(mockedSet, ['name'], ['desc']) - - // If iterable object is required, just create it after ordering - assert.deepStrictEqual(orderedArr, [ - { name: 'yyy' }, - { name: 'www' }, - { name: 'bbb' }, - { name: 'aaa' } - ]) - }) - - it('Order iterable object (Map) of objects by name prop and key in desc', () => { - const mockedMap = new Map([ - ['key1', { name: 'aaa' }], - ['key2', { name: 'www' }], - ['key3', { name: 'bbb' }], - ['key4', { name: 'yyy' }] - ]) - - const orderedArrByVal = orderBy( - mockedMap, - [([key, val]) => val?.name], - ['desc'] - ) - const orderedArrByKey = orderBy( - mockedMap, - [([key, val]) => key], - ['desc'] - ) - - // If iterable object is required, just create it after ordering - assert.deepStrictEqual(orderedArrByVal, [ - ['key4', { name: 'yyy' }], - ['key2', { name: 'www' }], - ['key3', { name: 'bbb' }], - ['key1', { name: 'aaa' }] - ]) - assert.deepStrictEqual(orderedArrByKey, [ - ['key4', { name: 'yyy' }], - ['key3', { name: 'bbb' }], - ['key2', { name: 'www' }], - ['key1', { name: 'aaa' }] - ]) - }) - - it('Order array of objects by name prop in desc with equal values', () => { - const mockedArr = [ - { name: 'aaa' }, - { name: 'www' }, - { name: 'www' }, - { name: 'bbb' }, - { name: 'yyy' }, - { name: 'aaa' } - ] - - const orderedArr = orderBy(mockedArr, ['name'], ['desc']) - - assert.deepStrictEqual(orderedArr, [ - { name: 'yyy' }, - { name: 'www' }, - { name: 'www' }, - { name: 'bbb' }, - { name: 'aaa' }, - { name: 'aaa' } - ]) - }) - - it('Order array of objects by name prop in desc with null and undefined', () => { - const mockedArr = [ - { name: undefined }, - { name: 'aaa' }, - { name: null }, - { name: 'www' }, - { name: null }, - { name: undefined }, - { name: null }, - { name: 'bbb' }, - { name: 'yyy' } - ] - - const orderedArr = orderBy(mockedArr, ['name'], ['desc']) - - assert.deepStrictEqual(orderedArr, [ - { name: 'yyy' }, - { name: 'www' }, - { name: 'bbb' }, - { name: 'aaa' }, - { name: undefined }, - { name: null }, - { name: null }, - { name: undefined }, - { name: null } - ]) - }) - - it('Order array of objects by name prop in asc with null and undefined', () => { - const mockedArr = [ - { name: undefined }, - { name: 'aaa' }, - { name: null }, - { name: 'www' }, - { name: null }, - { name: undefined }, - { name: null }, - { name: 'bbb' }, - { name: 'yyy' } - ] - - const orderedArr = orderBy(mockedArr, ['name'], ['asc']) - - assert.deepStrictEqual(orderedArr, [ - { name: 'aaa' }, - { name: 'bbb' }, - { name: 'www' }, - { name: 'yyy' }, - { name: undefined }, - { name: null }, - { name: null }, - { name: undefined }, - { name: null } - ]) - }) - - it('Order array of objects by name prop in desc with null and undefined items', () => { - const mockedArr = [ - { name: undefined }, - { name: 'aaa' }, - { name: null }, - { name: 'www' }, - null, - undefined, - { name: null }, - { name: undefined }, - { name: null }, - { name: 'bbb' }, - null, - { name: 'yyy' } - ] - - const orderedArr = orderBy(mockedArr, ['name'], ['desc']) - - assert.deepStrictEqual(orderedArr, [ - { name: 'yyy' }, - { name: 'www' }, - { name: 'bbb' }, - { name: 'aaa' }, - { name: undefined }, - { name: null }, - null, - { name: null }, - { name: undefined }, - { name: null }, - null, - /** - * Array.prototype.sort() behaviour: all undefined elements - * are sorted to the end of the array, with no call to compareFn - */ - undefined - ]) - }) - - it('Throw TypeError if non-iterable object is ordered', () => { - assert.throws( - () => orderBy(null, ['name'], ['desc']), - TypeError - ) - }) - - it('Throw TypeError if non-iterable object is prop name list', () => { - const mockedArr = [ - { name: 'aaa' }, - { name: 'www' }, - { name: 'bbb' }, - { name: 'yyy' } - ] - - assert.throws( - () => orderBy(mockedArr, null, ['desc']), - TypeError - ) - }) -}) diff --git a/workers/loc.api/helpers/utils/index.js b/workers/loc.api/helpers/utils/index.js index 62178336..2ebcff06 100644 --- a/workers/loc.api/helpers/utils/index.js +++ b/workers/loc.api/helpers/utils/index.js @@ -11,7 +11,6 @@ const sumObjectsNumbers = require('./sum-objects-numbers') const sumAllObjectsNumbers = require('./sum-all-objects-numbers') const sumArrayVolumes = require('./sum-array-volumes') const pushLargeArr = require('./push-large-arr') -const orderBy = require('./order-by') module.exports = { checkParamsAuth, @@ -24,6 +23,5 @@ module.exports = { sumObjectsNumbers, sumAllObjectsNumbers, sumArrayVolumes, - pushLargeArr, - orderBy + pushLargeArr } diff --git a/workers/loc.api/helpers/utils/order-by.js b/workers/loc.api/helpers/utils/order-by.js deleted file mode 100644 index 38f46ae2..00000000 --- a/workers/loc.api/helpers/utils/order-by.js +++ /dev/null @@ -1,61 +0,0 @@ -'use strict' - -const _getValue = (obj, path) => { - if ( - obj === undefined || - obj === null - ) { - return obj - } - if (typeof path !== 'string') { - return obj?.[path] - } - - return path.split('.').reduce((accum, key) => accum?.[key], obj) -} - -module.exports = (collection, iteratees = [], orders = []) => { - // It's able to consider iterable objects as well - // If iterable object is required, just create it after ordering, not here - const copiedColl = [...collection] - - return copiedColl.sort((a, b) => { - for (const [i, iteratee] of iteratees.entries()) { - const direction = orders[i] === 'desc' ? -1 : 1 - const isIterateeFn = typeof iteratee === 'function' - - const valA = isIterateeFn - ? iteratee(a) - : _getValue(a, iteratee) - const valB = isIterateeFn - ? iteratee(b) - : _getValue(b, iteratee) - - if (valA === valB) { - continue - } - - if ( - valA === undefined || - valA === null - ) { - return 1 - } - if ( - valB === undefined || - valB === null - ) { - return -1 - } - - if (valA > valB) { - return direction - } - if (valA < valB) { - return -direction - } - } - - return 0 - }) -} diff --git a/workers/loc.api/sync/colls.accessors/public.colls.conf.accessors.js b/workers/loc.api/sync/colls.accessors/public.colls.conf.accessors.js index 40f36b03..3cfe1b96 100644 --- a/workers/loc.api/sync/colls.accessors/public.colls.conf.accessors.js +++ b/workers/loc.api/sync/colls.accessors/public.colls.conf.accessors.js @@ -3,7 +3,8 @@ const { omit, pick, - isEmpty + isEmpty, + orderBy } = require('@bitfinex/lib-js-util-base') const { prepareResponse @@ -12,9 +13,6 @@ const { FindMethodError } = require('@bitfinex/bfx-report/workers/loc.api/errors') -const { - orderBy -} = require('../../helpers') const { GetPublicDataError } = require('../../errors') diff --git a/workers/loc.api/sync/currency.converter/index.js b/workers/loc.api/sync/currency.converter/index.js index 3c671e1f..07888ec9 100644 --- a/workers/loc.api/sync/currency.converter/index.js +++ b/workers/loc.api/sync/currency.converter/index.js @@ -2,6 +2,9 @@ const moment = require('moment') +const { + orderBy +} = require('@bitfinex/lib-js-util-base') const { FindMethodError } = require('@bitfinex/bfx-report/workers/loc.api/errors') @@ -16,8 +19,7 @@ const { isForexSymb } = require('../helpers') const { - tryParseJSON, - orderBy + tryParseJSON } = require('../../helpers') const SyncTempTablesManager = require( '../data.inserter/sync.temp.tables.manager' diff --git a/workers/loc.api/sync/dao/db.backup.manager/index.js b/workers/loc.api/sync/dao/db.backup.manager/index.js index c0e1e601..046dce6e 100644 --- a/workers/loc.api/sync/dao/db.backup.manager/index.js +++ b/workers/loc.api/sync/dao/db.backup.manager/index.js @@ -4,10 +4,12 @@ const { mkdirSync } = require('fs') const { readdir, rm, copyFile } = require('fs/promises') const path = require('path') const moment = require('moment') - const { - isBfxApiStaging, orderBy +} = require('@bitfinex/lib-js-util-base') + +const { + isBfxApiStaging } = require('../../../helpers') const { decorateInjectable } = require('../../../di/utils') diff --git a/workers/loc.api/sync/dao/helpers/find-in-coll-by/get-filter-params.js b/workers/loc.api/sync/dao/helpers/find-in-coll-by/get-filter-params.js index d81ca194..c3fb2ecd 100644 --- a/workers/loc.api/sync/dao/helpers/find-in-coll-by/get-filter-params.js +++ b/workers/loc.api/sync/dao/helpers/find-in-coll-by/get-filter-params.js @@ -10,43 +10,51 @@ const getInsertableArrayObjectsFilter = require( const getStatusMessagesFilter = require( '../get-status-messages-filter' ) -const TABLES_NAMES = require('../../../schema/tables-names') +const getLedgersFilter = require( + '../get-ledgers-filter' +) +const SUPPORTED_MODEL_FIELDS = require( + '../../../schema/sync-schema/model/supported.model.fields' +) module.exports = (args, methodColl, opts) => { - const { auth, params } = { ...args } - const { filter: requestedFilter } = { ...params } - const { isPublic } = { ...opts } + const { auth, params } = args ?? {} + const { filter: requestedFilter } = params ?? {} + const { isPublic } = opts ?? {} const statusMessagesfilter = getStatusMessagesFilter( methodColl, - params + args ) const insertableArrayObjectsFilter = getInsertableArrayObjectsFilter( methodColl, - params + args + ) + const ledgersFilter = getLedgersFilter( + methodColl, + args ) const filter = { ...insertableArrayObjectsFilter, - ...statusMessagesfilter + ...statusMessagesfilter, + ...ledgersFilter, + ...methodColl[SUPPORTED_MODEL_FIELDS.ADDITIONAL_FILTERING_PROPS] } - if (!isPublic) { - const { _id, isSubAccount } = { ...auth } - - if (!Number.isInteger(_id)) { - throw new AuthError() - } - if ( - methodColl.getModelField('NAME') === TABLES_NAMES.LEDGERS && - isSubAccount - ) { - filter._isBalanceRecalced = 1 + if (isPublic) { + return { + requestedFilter, + filter } + } - filter.user_id = _id + if (!Number.isInteger(auth?._id)) { + throw new AuthError() } + filter.user_id = auth._id + return { requestedFilter, filter diff --git a/workers/loc.api/sync/dao/helpers/get-insertable-array-objects-filter.js b/workers/loc.api/sync/dao/helpers/get-insertable-array-objects-filter.js index 58d4e945..0c55a202 100644 --- a/workers/loc.api/sync/dao/helpers/get-insertable-array-objects-filter.js +++ b/workers/loc.api/sync/dao/helpers/get-insertable-array-objects-filter.js @@ -41,10 +41,9 @@ module.exports = ( dateFieldName, model, symbolFieldName, - timeframeFieldName, - additionalFilteringProps + timeframeFieldName } = {}, - params = {} + args ) => { if (!isInsertableArrObj(type)) { return {} @@ -56,17 +55,16 @@ module.exports = ( symbol, timeframe, filter: reqFilter = {} - } = { ...params } + } = args?.params ?? {} const symbFilter = getSymbolFilter(symbol, symbolFieldName) const timeframeFilter = getTimeframeFilter(timeframe, timeframeFieldName) const fieldsFilters = getFieldsFilters( [ 'isMarginFundingPayment', 'isAffiliateRebate', - 'isStakingPayments', - 'category' + 'isStakingPayments' ], - params, + args?.params, model ) const filter = { @@ -74,7 +72,6 @@ module.exports = ( _dateFieldName: dateFieldName, start, end, - ...additionalFilteringProps, ...symbFilter, ...timeframeFilter, ...fieldsFilters diff --git a/workers/loc.api/sync/dao/helpers/get-ledgers-filter.js b/workers/loc.api/sync/dao/helpers/get-ledgers-filter.js new file mode 100644 index 00000000..519d4cba --- /dev/null +++ b/workers/loc.api/sync/dao/helpers/get-ledgers-filter.js @@ -0,0 +1,27 @@ +'use strict' + +const TABLES_NAMES = require('../../schema/tables-names') + +module.exports = ( + methodColl, + args +) => { + if (methodColl.getModelField('NAME') !== TABLES_NAMES.LEDGERS) { + return {} + } + + const { auth, params } = args ?? {} + const filter = {} + + if (auth?.isSubAccount) { + filter._isBalanceRecalced = 1 + } + if (params?.wallet) { + filter.wallet = params.wallet + } + if (params?.category) { + filter._category = params.category + } + + return filter +} diff --git a/workers/loc.api/sync/dao/helpers/get-status-messages-filter.js b/workers/loc.api/sync/dao/helpers/get-status-messages-filter.js index 6f4e2927..e4c11f24 100644 --- a/workers/loc.api/sync/dao/helpers/get-status-messages-filter.js +++ b/workers/loc.api/sync/dao/helpers/get-status-messages-filter.js @@ -6,10 +6,9 @@ const getSymbolFilter = require('./get-symbol-filter') module.exports = ( { name, - symbolFieldName, - additionalFilteringProps + symbolFieldName } = {}, - params = {} + args ) => { if (name !== TABLES_NAMES.STATUS_MESSAGES) { return {} @@ -19,12 +18,11 @@ module.exports = ( type, symbol, filter: reqFilter = {} - } = { ...params } + } = args?.params ?? {} const symbFilter = getSymbolFilter(symbol, symbolFieldName) const filter = { ...reqFilter, _type: type, - ...additionalFilteringProps, ...symbFilter } diff --git a/workers/loc.api/sync/data.inserter/hooks/recalc.sub.account.ledgers.balances.hook.js b/workers/loc.api/sync/data.inserter/hooks/recalc.sub.account.ledgers.balances.hook.js index fb4ada0b..7452d37b 100644 --- a/workers/loc.api/sync/data.inserter/hooks/recalc.sub.account.ledgers.balances.hook.js +++ b/workers/loc.api/sync/data.inserter/hooks/recalc.sub.account.ledgers.balances.hook.js @@ -3,12 +3,14 @@ const { promisify } = require('util') const setImmediatePromise = promisify(setImmediate) -const { merge } = require('@bitfinex/lib-js-util-base') +const { + merge, + orderBy +} = require('@bitfinex/lib-js-util-base') const SyncTempTablesManager = require('../sync.temp.tables.manager') const DataInserterHook = require('./data.inserter.hook') const { getAuthFromDb } = require('../helpers/utils') -const { orderBy } = require('../../../helpers') const { SubAccountLedgersBalancesRecalcError } = require('../../../errors') diff --git a/workers/loc.api/sync/movements/index.js b/workers/loc.api/sync/movements/index.js index 362c4a27..48deb960 100644 --- a/workers/loc.api/sync/movements/index.js +++ b/workers/loc.api/sync/movements/index.js @@ -1,10 +1,12 @@ 'use strict' -const { merge } = require('@bitfinex/lib-js-util-base') - const { - pushLargeArr, + merge, orderBy +} = require('@bitfinex/lib-js-util-base') + +const { + pushLargeArr } = require('../../helpers/utils') const { decorateInjectable } = require('../../di/utils') diff --git a/workers/loc.api/sync/positions.snapshot/index.js b/workers/loc.api/sync/positions.snapshot/index.js index 16ebf632..5de4ebea 100644 --- a/workers/loc.api/sync/positions.snapshot/index.js +++ b/workers/loc.api/sync/positions.snapshot/index.js @@ -1,10 +1,12 @@ 'use strict' +const { + orderBy +} = require('@bitfinex/lib-js-util-base') const { splitSymbolPairs } = require('@bitfinex/bfx-report/workers/loc.api/helpers') -const { orderBy } = require('../../helpers') const { groupByTimeframe, getMtsGroupedByTimeframe, diff --git a/workers/loc.api/sync/sub.account.api.data/index.js b/workers/loc.api/sync/sub.account.api.data/index.js index b7eb1240..80b846d6 100644 --- a/workers/loc.api/sync/sub.account.api.data/index.js +++ b/workers/loc.api/sync/sub.account.api.data/index.js @@ -1,7 +1,8 @@ 'use strict' const { - isEmpty + isEmpty, + orderBy } = require('@bitfinex/lib-js-util-base') const { prepareResponse @@ -11,9 +12,6 @@ const { FindMethodError } = require('@bitfinex/bfx-report/workers/loc.api/errors') -const { - orderBy -} = require('../../helpers') const { DatePropNameError } = require('../../errors') diff --git a/workers/loc.api/sync/sub.account/index.js b/workers/loc.api/sync/sub.account/index.js index a6fbaf5e..ba02a9e4 100644 --- a/workers/loc.api/sync/sub.account/index.js +++ b/workers/loc.api/sync/sub.account/index.js @@ -1,13 +1,15 @@ 'use strict' +const { + orderBy +} = require('@bitfinex/lib-js-util-base') const { AuthError } = require('@bitfinex/bfx-report/workers/loc.api/errors') const { isSubAccountApiKeys, - getSubAccountAuthFromAuth, - orderBy + getSubAccountAuthFromAuth } = require('../../helpers') const { SubAccountCreatingError,