From 2cfea75681f499d01fd621a3b717a08238db83a3 Mon Sep 17 00:00:00 2001 From: Emiliano Sanchez Date: Mon, 12 May 2025 13:20:24 -0300 Subject: [PATCH 1/4] Fix typos and other README updates --- .github/workflows/ci.yml | 2 +- CHANGES.txt | 2 +- CONTRIBUTORS-GUIDE.md | 2 +- README.md | 5 +++-- e2e/utils/SDKConsumerMode.ts | 2 +- e2e/utils/redisAdapterWrapper.ts | 2 +- src/cli.ts | 2 +- types/index.d.ts | 6 +++--- 8 files changed, 12 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 24daded..2f573b0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: with: fetch-depth: 0 - - name: Set up nodejs + - name: Set up Node.js uses: actions/setup-node@v3 with: node-version: 'lts/*' diff --git a/CHANGES.txt b/CHANGES.txt index 7130c42..b5f8a95 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,5 +1,5 @@ 0.7.0 (August 5, 2024) - - Added `sync.requestOptions.agent` option to allow passing a custom NodeJS HTTP(S) Agent with specific configurations for the Synchronizer requests, like custom TLS settings or a network proxy (See https://help.split.io/hc/en-us/articles/4421513571469-Split-JavaScript-synchronizer-tools#proxy). + - Added `sync.requestOptions.agent` option to allow passing a custom Node.js HTTP(S) Agent with specific configurations for the Synchronizer requests, like custom TLS settings or a network proxy (See https://help.split.io/hc/en-us/articles/4421513571469-Split-JavaScript-synchronizer-tools#proxy). - Updated some transitive dependencies for vulnerability fixes. 0.6.0 (May 13, 2024) diff --git a/CONTRIBUTORS-GUIDE.md b/CONTRIBUTORS-GUIDE.md index 8cb7d24..7a81ec2 100644 --- a/CONTRIBUTORS-GUIDE.md +++ b/CONTRIBUTORS-GUIDE.md @@ -7,7 +7,7 @@ Split JavaScript Sync Tools is an open source project and we welcome feedback an ### Development process 1. Fork the repository and create a topic branch from `development` branch. Please use a descriptive name for your branch. -2. Run `nvm use` to ensure that you are using the right npm and node version, and `npm install` to have the dependencies up to date. +2. Run `nvm use` to ensure that you are using the right npm and Node.js version, and `npm install` to have the dependencies up to date. 3. While developing, use descriptive messages in your commits. Avoid short or meaningless sentences like: "fix bug". 4. Make sure to add tests for both positive and negative cases. 5. Run the linter script of the project and fix any issues you find. diff --git a/README.md b/README.md index 3ba1ef0..e1f05a5 100644 --- a/README.md +++ b/README.md @@ -65,13 +65,14 @@ Split has built and maintains SDKs for: * .NET [Github](https://github.com/splitio/dotnet-client) [Docs](https://help.split.io/hc/en-us/articles/360020240172--NET-SDK) * Android [Github](https://github.com/splitio/android-client) [Docs](https://help.split.io/hc/en-us/articles/360020343291-Android-SDK) * Angular [Github](https://github.com/splitio/angular-sdk-plugin) [Docs](https://help.split.io/hc/en-us/articles/6495326064397-Angular-utilities) +* Elixir thin-client [Github](https://github.com/splitio/elixir-thin-client) [Docs](https://help.split.io/hc/en-us/articles/26988707417869-Elixir-Thin-Client-SDK) * Flutter [Github](https://github.com/splitio/flutter-sdk-plugin) [Docs](https://help.split.io/hc/en-us/articles/8096158017165-Flutter-plugin) * GO [Github](https://github.com/splitio/go-client) [Docs](https://help.split.io/hc/en-us/articles/360020093652-Go-SDK) * iOS [Github](https://github.com/splitio/ios-client) [Docs](https://help.split.io/hc/en-us/articles/360020401491-iOS-SDK) * Java [Github](https://github.com/splitio/java-client) [Docs](https://help.split.io/hc/en-us/articles/360020405151-Java-SDK) * JavaScript [Github](https://github.com/splitio/javascript-client) [Docs](https://help.split.io/hc/en-us/articles/360020448791-JavaScript-SDK) * JavaScript for Browser [Github](https://github.com/splitio/javascript-browser-client) [Docs](https://help.split.io/hc/en-us/articles/360058730852-Browser-SDK) -* Node [Github](https://github.com/splitio/javascript-client) [Docs](https://help.split.io/hc/en-us/articles/360020564931-Node-js-SDK) +* Node.js [Github](https://github.com/splitio/javascript-client) [Docs](https://help.split.io/hc/en-us/articles/360020564931-Node-js-SDK) * PHP [Github](https://github.com/splitio/php-client) [Docs](https://help.split.io/hc/en-us/articles/360020350372-PHP-SDK) * PHP thin-client [Github](https://github.com/splitio/php-thin-client) [Docs](https://help.split.io/hc/en-us/articles/18305128673933-PHP-Thin-Client-SDK) * Python [Github](https://github.com/splitio/python-client) [Docs](https://help.split.io/hc/en-us/articles/360020359652-Python-SDK) @@ -84,4 +85,4 @@ For a comprehensive list of open source projects visit our [Github page](https:/ **Learn more about Split:** -Visit [split.io/product](https://www.split.io/product) for an overview of Split, or visit our documentation at [help.split.io](http://help.split.io) for more detailed information. +Visit [split.io/product](https://www.split.io/product) for an overview of Split, or visit our documentation at [help.split.io](https://help.split.io) for more detailed information. diff --git a/e2e/utils/SDKConsumerMode.ts b/e2e/utils/SDKConsumerMode.ts index 4c116da..9214d1e 100644 --- a/e2e/utils/SDKConsumerMode.ts +++ b/e2e/utils/SDKConsumerMode.ts @@ -33,7 +33,7 @@ export default function runSDKConsumer(impressionsMode: ImpressionsMode) { impressionsMode, }, // @ts-ignore }, (modules) => { - // Using pluggable storage in NodeJS SDK + // Using pluggable storage in Node.js modules.storageFactory = PluggableStorage({ prefix: modules.settings.storage.prefix, wrapper: redisAdapterWrapper(modules.settings.storage.options), diff --git a/e2e/utils/redisAdapterWrapper.ts b/e2e/utils/redisAdapterWrapper.ts index 5da3870..7416dd2 100644 --- a/e2e/utils/redisAdapterWrapper.ts +++ b/e2e/utils/redisAdapterWrapper.ts @@ -2,7 +2,7 @@ import { RedisAdapter } from '@splitsoftware/splitio-commons/src/storages/inRedi import { IPluggableStorageWrapper } from '@splitsoftware/splitio-commons/src/storages/types'; import { noopLogger } from '../../src/submitters/__tests__/commonUtils'; -// @TODO refactor: move to JS-commons, rename to `ioredisWrapper`, and reuse in JS SDK for Node +// @TODO refactor: move to JS-commons, rename to `ioredisWrapper`, and reuse in JS SDK for Node.js /** * Creates a storage wrapper that uses our RedisAdapter. * Operations fail until `connect` is resolved once the Redis 'ready' event is emitted. diff --git a/src/cli.ts b/src/cli.ts index bde226c..1ad207a 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -300,7 +300,7 @@ const synchronizer = new Synchronizer({ }); /** - * Function to exit node with error. + * Function to exit Node.js with error. */ function informFailedExecute() { console.log('# Split Synchronizer tool execution terminated with issues'); diff --git a/types/index.d.ts b/types/index.d.ts index b94454f..a0fae81 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -1,5 +1,5 @@ // Type definitions for Split JavaScript Sync Tools -// Project: http://www.split.io/ +// Project: https://www.split.io/ // Definitions by: Emiliano Sanchez import { RequestOptions } from 'http'; @@ -188,13 +188,13 @@ declare module JsSyncTools { */ impressionsMode?: ImpressionsMode /** - * Custom options object for HTTP(S) requests in NodeJS. + * Custom options object for HTTP(S) requests in Node.js. * If provided, this object is merged with the options object passed for Node-Fetch calls. * @see {@link https://www.npmjs.com/package/node-fetch#options} */ requestOptions?: { /** - * Custom NodeJS HTTP(S) Agent used for HTTP(S) requests. + * Custom Node.js HTTP(S) Agent used for HTTP(S) requests. * * You can use it, for example, for certificate pinning or setting a network proxy: * From 53bcbd8c2294ebe0a93271fc03aceaea78a2f883 Mon Sep 17 00:00:00 2001 From: Emiliano Sanchez Date: Mon, 12 May 2025 15:37:16 -0300 Subject: [PATCH 2/4] Bump dependencies for vulnerability fixes --- CHANGES.txt | 3 + package-lock.json | 407 ++++++++++++++++------------------------------ 2 files changed, 147 insertions(+), 263 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index b5f8a95..221b2a2 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,6 @@ +0.7.1 (May XXX, 2024) + - Updated some transitive dependencies for vulnerability fixes. + 0.7.0 (August 5, 2024) - Added `sync.requestOptions.agent` option to allow passing a custom Node.js HTTP(S) Agent with specific configurations for the Synchronizer requests, like custom TLS settings or a network proxy (See https://help.split.io/hc/en-us/articles/4421513571469-Split-JavaScript-synchronizer-tools#proxy). - Updated some transitive dependencies for vulnerability fixes. diff --git a/package-lock.json b/package-lock.json index c0c99f9..e78b191 100644 --- a/package-lock.json +++ b/package-lock.json @@ -280,19 +280,21 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -307,14 +309,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -406,10 +408,14 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", - "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", + "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -580,103 +586,35 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", - "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/template/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/template/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/template/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/template/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/template/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/template/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/template/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/traverse": { "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.4.tgz", @@ -792,14 +730,14 @@ } }, "node_modules/@babel/types": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", - "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2422,12 +2360,13 @@ } }, "node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", "dev": true, + "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -3073,10 +3012,11 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -4238,10 +4178,11 @@ } }, "node_modules/express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -4262,7 +4203,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -4277,6 +4218,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express-urlrewrite": { @@ -4290,10 +4235,11 @@ } }, "node_modules/express-urlrewrite/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", "dev": true, + "license": "MIT", "dependencies": { "isarray": "0.0.1" } @@ -6774,12 +6720,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -6911,9 +6858,9 @@ "devOptional": true }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -6921,6 +6868,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -7318,10 +7266,11 @@ "dev": true }, "node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", - "dev": true + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true, + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", @@ -7342,10 +7291,11 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.2", @@ -9198,15 +9148,6 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -10061,15 +10002,15 @@ } }, "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true }, "@babel/helper-validator-option": { @@ -10079,14 +10020,13 @@ "dev": true }, "@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", "dev": true, "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" } }, "@babel/highlight": { @@ -10159,10 +10099,13 @@ } }, "@babel/parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", - "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==", - "dev": true + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", + "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", + "dev": true, + "requires": { + "@babel/types": "^7.27.1" + } }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -10282,80 +10225,25 @@ } }, "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "dependencies": { "@babel/code-frame": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", - "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" } } } @@ -10453,14 +10341,13 @@ } }, "@babel/types": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", - "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" } }, "@bcoe/v8-coverage": { @@ -11641,12 +11528,12 @@ "dev": true }, "axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", "dev": true, "requires": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" }, @@ -12130,9 +12017,9 @@ } }, "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -13013,9 +12900,9 @@ } }, "express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, "requires": { "accepts": "~1.3.8", @@ -13037,7 +12924,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -13085,9 +12972,9 @@ }, "dependencies": { "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", "dev": true, "requires": { "isarray": "0.0.1" @@ -14941,12 +14828,12 @@ "dev": true }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "dependencies": { @@ -15046,9 +14933,9 @@ "devOptional": true }, "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true }, "natural-compare": { @@ -15333,9 +15220,9 @@ "dev": true }, "path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "dev": true }, "path-type": { @@ -15354,9 +15241,9 @@ } }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "picomatch": { @@ -16734,12 +16621,6 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", From db161e97ae6fd33c8ee0a8d19be5bdf5dfc97b35 Mon Sep 17 00:00:00 2001 From: Emiliano Sanchez Date: Mon, 12 May 2025 15:53:26 -0300 Subject: [PATCH 3/4] Update changelog entry date --- CHANGES.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.txt b/CHANGES.txt index 221b2a2..d4af3fa 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,4 @@ -0.7.1 (May XXX, 2024) +0.7.1 (May XXX, 2025) - Updated some transitive dependencies for vulnerability fixes. 0.7.0 (August 5, 2024) From 9f86bded92a9696b2ce60508d98447488b010016 Mon Sep 17 00:00:00 2001 From: Emiliano Sanchez Date: Mon, 12 May 2025 19:44:05 -0300 Subject: [PATCH 4/4] Fix typos --- CHANGES.txt | 4 +- src/Synchronizer.ts | 42 +++++++++---------- src/cli.ts | 4 +- src/settings/defaults.ts | 2 +- src/submitters/__tests__/eventsMockUtils.ts | 18 ++++---- .../__tests__/impressionsMockUtils.ts | 18 ++++---- .../__tests__/impressionsSubmitter.spec.ts | 34 +++++++-------- src/submitters/impressionsSubmitter.ts | 2 +- src/synchronizers/SplitsSynchronizer.ts | 4 +- .../__tests__/SplitsSynchronizer.spec.ts | 6 +-- types/index.d.ts | 2 +- 11 files changed, 67 insertions(+), 69 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index d4af3fa..3dc954a 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -34,8 +34,8 @@ 0.3.0 (May 4, 2023) - Added an optional error-first callback parameter to `execute` method, to be called when the synchronization is finished, with an error object if it finished unsuccessfully. - Updated @splitsoftware/splitio-commons and other dependencies for vulnerability fixes and performance improvements. - - Bugfixing - Fixed `execute` method to ensure the returned promise resolves to `false` if any synchronization task fails (i.e., synchronization of feature flags, segments, impressions or events). - - Bugfixing - Fixed `execute` method to await storage destroy promise and handle rejections. + - Bugfix - Fixed `execute` method to ensure the returned promise resolves to `false` if any synchronization task fails (i.e., synchronization of feature flags, segments, impressions or events). + - Bugfix - Fixed `execute` method to await storage destroy promise and handle rejections. 0.2.0 (October 5, 2022) - Added support for synchronizing telemetry data, impression counts and unique keys in pluggable storage. diff --git a/src/Synchronizer.ts b/src/Synchronizer.ts index 72b6c5b..4682669 100644 --- a/src/Synchronizer.ts +++ b/src/Synchronizer.ts @@ -131,7 +131,7 @@ export class Synchronizer { * Function to set all the required Synchronizers. */ private initializeSynchronizers() { - // @todo: Add Cli paramater to define impressionsMode. + // @todo: Add Cli parameter to define impressionsMode. const countsCache = this.settings.sync.impressionsMode === 'OPTIMIZED' ? new ImpressionCountsCacheInMemory() : undefined; @@ -209,7 +209,7 @@ export class Synchronizer { } /** * Function to wrap actions to perform after the sync tasks have been executed. - * Currently, it disconects from the Storage. + * Currently, it disconnects from the Storage. * * @returns {Promise} A promise that resolves if the synchronizer has successfully disconnected from the storage. Otherwise, it rejects with an error. */ @@ -265,15 +265,15 @@ export class Synchronizer { if (standalone) await this.preExecute(); // @TODO optimize SplitChangesUpdater to reduce storage operations ("inMemoryOperation" mode) - const isSplitsSyncSuccessfull = await this._splitsSynchronizer.getSplitChanges(); + const isSplitsSyncSuccessful = await this._splitsSynchronizer.getSplitChanges(); - this.settings.log.debug(`Feature flags Synchronizer task: ${isSplitsSyncSuccessfull ? 'Successful' : 'Unsuccessful'}`); - const isSegmentsSyncSuccessfull = await this._segmentsSynchronizer.getSegmentsChanges(); - this.settings.log.debug(`Segments Synchronizer task: ${isSegmentsSyncSuccessfull ? 'Successful' : 'Unsuccessful'}`); + this.settings.log.debug(`Feature flags Synchronizer task: ${isSplitsSyncSuccessful ? 'Successful' : 'Unsuccessful'}`); + const isSegmentsSyncSuccessful = await this._segmentsSynchronizer.getSegmentsChanges(); + this.settings.log.debug(`Segments Synchronizer task: ${isSegmentsSyncSuccessful ? 'Successful' : 'Unsuccessful'}`); if (standalone) await this.postExecute(); - return isSplitsSyncSuccessfull && isSegmentsSyncSuccessfull; + return isSplitsSyncSuccessful && isSegmentsSyncSuccessful; } /** * Function to wrap the execution of the Impressions and Event's synchronizers. @@ -285,32 +285,32 @@ export class Synchronizer { const log = this.settings.log; if (standalone) await this.preExecute(); - const isEventsSyncSuccessfull = await this._eventsSubmitter(); - log.debug(`Events Synchronizer task: ${isEventsSyncSuccessfull ? 'Successful' : 'Unsuccessful'}`); - const isImpressionsSyncSuccessfull = await this._impressionsSubmitter(); - log.debug(`Impressions Synchronizer task: ${isImpressionsSyncSuccessfull ? 'Successful' : 'Unsuccessful'}`); + const isEventsSyncSuccessful = await this._eventsSubmitter(); + log.debug(`Events Synchronizer task: ${isEventsSyncSuccessful ? 'Successful' : 'Unsuccessful'}`); + const isImpressionsSyncSuccessful = await this._impressionsSubmitter(); + log.debug(`Impressions Synchronizer task: ${isImpressionsSyncSuccessful ? 'Successful' : 'Unsuccessful'}`); - let isSyncSuccessfull = isEventsSyncSuccessfull && isImpressionsSyncSuccessfull; + let isSyncSuccessful = isEventsSyncSuccessful && isImpressionsSyncSuccessful; if (this._impressionCountsSubmitter) { - const isImpressionCountsSyncSuccessfull = await this._impressionCountsSubmitter(); - isSyncSuccessfull = isSyncSuccessfull && isImpressionCountsSyncSuccessfull; - log.debug(`ImpressionCounts Synchronizer task: ${isImpressionCountsSyncSuccessfull ? 'Successful' : 'Unsuccessful'}`); + const isImpressionCountsSyncSuccessful = await this._impressionCountsSubmitter(); + isSyncSuccessful = isSyncSuccessful && isImpressionCountsSyncSuccessful; + log.debug(`ImpressionCounts Synchronizer task: ${isImpressionCountsSyncSuccessful ? 'Successful' : 'Unsuccessful'}`); } if (this._uniqueKeysSubmitter) { - const isUniqueKeysSyncSuccessfull = await this._uniqueKeysSubmitter(); - isSyncSuccessfull = isSyncSuccessfull && isUniqueKeysSyncSuccessfull; - log.debug(`UniqueKeys Synchronizer task: ${isUniqueKeysSyncSuccessfull ? 'Successful' : 'Unsuccessful'}`); + const isUniqueKeysSyncSuccessful = await this._uniqueKeysSubmitter(); + isSyncSuccessful = isSyncSuccessful && isUniqueKeysSyncSuccessful; + log.debug(`UniqueKeys Synchronizer task: ${isUniqueKeysSyncSuccessful ? 'Successful' : 'Unsuccessful'}`); } if (this._telemetrySubmitter) { - const isTelemetrySyncSuccessfull = await this._telemetrySubmitter(); + const isTelemetrySyncSuccessful = await this._telemetrySubmitter(); // if telemetry sync fails, we don't return false, since it's not a critical operation - log.debug(`Telemetry Synchronizer task: ${isTelemetrySyncSuccessfull ? 'Successful' : 'Unsuccessful'}`); + log.debug(`Telemetry Synchronizer task: ${isTelemetrySyncSuccessful ? 'Successful' : 'Unsuccessful'}`); } - return isSyncSuccessfull; + return isSyncSuccessful; } /** * Function to set the Fetch function to perform the requests. It can be provided through diff --git a/src/cli.ts b/src/cli.ts index 1ad207a..63be223 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -60,7 +60,7 @@ const _scheduler: NonNullable = { // @todo: refactor param alias and args to be all wrapped under the `options` function. const yargv = yargs(hideBin(argv)) .usage('Usage: $0 [options]') - .command('sync', 'Start synchronising tasks.') + .command('sync', 'Start synchronizing tasks.') .example('$0 -m json --config path2/file.json -s path2/storage.js', '| Set settings from JSON file. -d') .example('$0 -m env -s path2/storage.js', '| Set settings from .env file.') .example( @@ -150,7 +150,7 @@ const yargv = yargs(hideBin(argv)) // g: { // alias: 'inMemoryOperation', // type: 'boolean', - // description: 'Flag that enables all the synchronization operations to be proccessed in Memory.', + // description: 'Flag that enables all the synchronization operations to be processed in Memory.', // nargs: 0, // }, }) diff --git a/src/settings/defaults.ts b/src/settings/defaults.ts index 46183fa..6a89b50 100644 --- a/src/settings/defaults.ts +++ b/src/settings/defaults.ts @@ -5,7 +5,7 @@ const version = '@VERSION@'; /** - * Default values to create settings for the Javascrip Synchronizer. + * Default values to create settings for the JavaScript Synchronizer. */ export const defaults = { startup: { diff --git a/src/submitters/__tests__/eventsMockUtils.ts b/src/submitters/__tests__/eventsMockUtils.ts index eeb1b1a..27b7ad7 100644 --- a/src/submitters/__tests__/eventsMockUtils.ts +++ b/src/submitters/__tests__/eventsMockUtils.ts @@ -22,16 +22,16 @@ export const singleEventMockNoProperties = `{ } }`; /** - * Function to return a single Mock Event, with the option to randomise some of its data. + * Function to return a single Mock Event, with the option to randomize some of its data. * - * @param {boolean} isSetMaxSize Flag to decide to randomise some of the Metadata. - * @param {boolean} randomise Flag to decide to randomise some of the Metadata. + * @param {boolean} isSetMaxSize Flag to decide to randomize some of the Metadata. + * @param {boolean} randomize Flag to decide to randomize some of the Metadata. * @returns {string} */ -export function getSingleEventString(isSetMaxSize = false, randomise = false): string { +export function getSingleEventString(isSetMaxSize = false, randomize = false): string { const _newEvent = JSON.parse(singleEventMockNoProperties); - // Randomise metadata.name parameter. - if (randomise) { + // Randomize metadata.name parameter. + if (randomize) { _newEvent.m.n = _getRandomString(14); } // Add Properties object with a string value to reach 1024 bytes size for event limit. @@ -47,15 +47,15 @@ export function getSingleEventString(isSetMaxSize = false, randomise = false): s * * @param {number} amount The amount of events to add and return in the list. * @param {boolean} isSetMaxSize The flag to define if the events are set to its Max Size. - * @param {boolean} randomise The flag to set the same random metadata for the events in the list. + * @param {boolean} randomize The flag to set the same random metadata for the events in the list. * @returns {StoredEventWithMetadata[]} */ export function getMultipleEventsSameMetadata( amount: number, isSetMaxSize: boolean = false, - randomise: boolean = false + randomize: boolean = false ): StoredEventWithMetadata[] { - const _singleEvent = getSingleEventString(isSetMaxSize, randomise); + const _singleEvent = getSingleEventString(isSetMaxSize, randomize); const _eventsList = []; for (let i = 0; i < amount; i++) { diff --git a/src/submitters/__tests__/impressionsMockUtils.ts b/src/submitters/__tests__/impressionsMockUtils.ts index 1764393..fa55167 100644 --- a/src/submitters/__tests__/impressionsMockUtils.ts +++ b/src/submitters/__tests__/impressionsMockUtils.ts @@ -38,7 +38,7 @@ const impressionWithMetadata: StoredImpressionWithMetadata = { * * @returns {StoredImpressionWithMetadata} */ -function getRandomiseMetadata(): StoredImpressionWithMetadata { +function getRandomizeMetadata(): StoredImpressionWithMetadata { const { i, s } = impressionWithMetadata.m; return Object.assign( {}, @@ -52,7 +52,7 @@ function getRandomiseMetadata(): StoredImpressionWithMetadata { * * @returns {StoredImpressionWithMetadata} */ -function getRandomiseImpression(): StoredImpressionWithMetadata { +function getRandomizeImpression(): StoredImpressionWithMetadata { const { k, t, m, b, r, c } = impressionWithMetadata.i; return Object.assign( {}, @@ -72,21 +72,19 @@ export function getImpressionSampleWithNoMetadata(): ImpressionDTO { * Function to generate a list of Impressions with the same metadata. * * @param {number} len The amount of Impressions to generate. - * @param {boolean} randomiseMetadata Flag to determine if Metadata needs to be randomly generated. - * @param {boolean} randomiseImpression Flag to determine if Impression data needs to be randomly generated. + * @param {boolean} randomizeMetadata Flag to determine if Metadata needs to be randomly generated. + * @param {boolean} randomizeImpression Flag to determine if Impression data needs to be randomly generated. * @returns {StoredImpressionWithMetadata[]} */ export function getImpressionsListWithSameMetadata( len: number, - randomiseMetadata = false, - randomiseImpression = false + randomizeMetadata = false, + randomizeImpression = false ): StoredImpressionWithMetadata[] { const _impressionTarget = { - m: randomiseMetadata ? getRandomiseMetadata().m : impressionWithMetadata.m, - i: randomiseImpression ? getRandomiseImpression().i : impressionWithMetadata.i, + m: randomizeMetadata ? getRandomizeMetadata().m : impressionWithMetadata.m, + i: randomizeImpression ? getRandomizeImpression().i : impressionWithMetadata.i, }; return [...Array(len).keys()].map(() => _impressionTarget); } - - diff --git a/src/submitters/__tests__/impressionsSubmitter.spec.ts b/src/submitters/__tests__/impressionsSubmitter.spec.ts index bbc7732..0b182eb 100644 --- a/src/submitters/__tests__/impressionsSubmitter.spec.ts +++ b/src/submitters/__tests__/impressionsSubmitter.spec.ts @@ -20,7 +20,7 @@ describe('Impressions Submitter for Lightweight Synchronizer', () => { getImpressionsCount: jest.fn(() => Promise.resolve()), }; let countsCache: ImpressionCountsCacheInMemory; - let _impressionsSubmiter: { (): any; (): Promise; }; + let _impressionsSubmitter: { (): any; (): Promise; }; beforeEach(() => { _postImpressionsMock.mockClear(); @@ -33,7 +33,7 @@ describe('Impressions Submitter for Lightweight Synchronizer', () => { describe('Impressions Submitter, with [OPTIMIZED] mode set in settings', () => { beforeEach(() => { - _impressionsSubmiter = impressionsSubmitterFactory( + _impressionsSubmitter = impressionsSubmitterFactory( noopLogger, // @ts-ignore _postImpressionsMock, _impressionsCacheMock, @@ -49,7 +49,7 @@ describe('Impressions Submitter for Lightweight Synchronizer', () => { then make [0] Impressions Count POST`, async () => { _impressionsCacheMock.popNWithMetadata.mockReturnValue(Promise.resolve(([]))); - const res = await _impressionsSubmiter(); + const res = await _impressionsSubmitter(); expect(_impressionsCacheMock.popNWithMetadata).toBeCalledWith(1000); expect(_postImpressionsMock).toBeCalledTimes(0); @@ -72,7 +72,7 @@ describe('Impressions Submitter for Lightweight Synchronizer', () => { const _mockImpressionsListWMetadata = getImpressionsListWithSameMetadata(2, true); _impressionsCacheMock.popNWithMetadata.mockReturnValue(Promise.resolve((_mockImpressionsListWMetadata))); - const res = await _impressionsSubmiter(); + const res = await _impressionsSubmitter(); expect(_impressionsCacheMock.popNWithMetadata).toBeCalledWith(1000); expect(_postImpressionsMock).toBeCalledWith( @@ -112,7 +112,7 @@ describe('Impressions Submitter for Lightweight Synchronizer', () => { _impressionsCacheMock.popNWithMetadata.mockReturnValue(Promise.resolve((_mockImpressionsListWMetadata))); - const res = await _impressionsSubmiter(); + const res = await _impressionsSubmitter(); expect(_impressionsCacheMock.popNWithMetadata).toBeCalledWith(1000); expect(_postImpressionsMock).toHaveBeenNthCalledWith( @@ -156,7 +156,7 @@ describe('Impressions Submitter for Lightweight Synchronizer', () => { _impressionsCacheMock.popNWithMetadata.mockReturnValue(Promise.resolve((_mockImpressionsListWMetadata))); - const res = await _impressionsSubmiter(); + const res = await _impressionsSubmitter(); expect(_impressionsCacheMock.popNWithMetadata).toBeCalledWith(1000); expect(_postImpressionsMock).toBeCalledTimes(2); @@ -205,7 +205,7 @@ describe('Impressions Submitter for Lightweight Synchronizer', () => { describe('Impressions Submitter, with [DEBUG] mode set in settings', () => { beforeEach(() => { - _impressionsSubmiter = impressionsSubmitterFactory( + _impressionsSubmitter = impressionsSubmitterFactory( noopLogger, // @ts-ignore _postImpressionsMock, _impressionsCacheMock, @@ -217,11 +217,11 @@ describe('Impressions Submitter for Lightweight Synchronizer', () => { const _mockImpressionsListWMetadata = getImpressionsListWithSameMetadata(2, true); _impressionsCacheMock.popNWithMetadata.mockReturnValue(Promise.resolve((_mockImpressionsListWMetadata))); - const res = await _impressionsSubmiter(); + const res = await _impressionsSubmitter(); expect(_impressionsCacheMock.popNWithMetadata).toBeCalledWith(1000); // The reason we are parsing the object and validating its keys (and its according value type) is because - // the `pt` key only exists in some impressions (that are repeated), and comparing the stringigy version + // the `pt` key only exists in some impressions (that are repeated), and comparing the stringified version // of the parameter in the call and the expected stringify value is not going to work. // @ts-ignore const call = JSON.parse(_postImpressionsMock.mock.calls[0][0]); @@ -260,7 +260,7 @@ describe('Impressions Submitter for Lightweight Synchronizer', () => { _impressionsCacheMock.popNWithMetadata.mockReturnValue(Promise.resolve((_mockImpressionsListWMetadata))); - const res = await _impressionsSubmiter(); + const res = await _impressionsSubmitter(); expect(_impressionsCacheMock.popNWithMetadata).toBeCalledWith(1000); expect(_postImpressionsMock).toHaveBeenNthCalledWith( @@ -291,7 +291,7 @@ describe('Impressions Submitter for Lightweight Synchronizer', () => { _impressionsCacheMock.popNWithMetadata.mockReturnValue(Promise.resolve((_mockImpressionsListWMetadata))); - const res = await _impressionsSubmiter(); + const res = await _impressionsSubmitter(); expect(_impressionsCacheMock.popNWithMetadata).toBeCalledWith(1000); expect(_postImpressionsMock).toBeCalledTimes(2); @@ -306,7 +306,7 @@ describe('Impressions Submitter for Lightweight Synchronizer', () => { describe('Impressions Submitter with custom configs and fail scenarios', () => { test('Multiple runs [2] times, until storage count is 0', async () => { // @ts-ignore - _impressionsSubmiter = impressionsSubmitterFactory( + _impressionsSubmitter = impressionsSubmitterFactory( noopLogger, // @ts-ignore _postImpressionsMock, _impressionsCacheMock, @@ -318,7 +318,7 @@ describe('Impressions Submitter for Lightweight Synchronizer', () => { .mockReturnValueOnce(Promise.resolve(3)) .mockReturnValue(Promise.resolve(0)); - const res = await _impressionsSubmiter(); + const res = await _impressionsSubmitter(); expect(_impressionsCacheMock.popNWithMetadata).toBeCalledTimes(2); expect(res).toBe(true); @@ -327,7 +327,7 @@ describe('Impressions Submitter for Lightweight Synchronizer', () => { test('Run PopFromStorage with parameter value [33]', async () => { const IMPRESSIONS_PER_POST = 33; - _impressionsSubmiter = impressionsSubmitterFactory( + _impressionsSubmitter = impressionsSubmitterFactory( noopLogger, // @ts-ignore _postImpressionsMock, _impressionsCacheMock, @@ -337,7 +337,7 @@ describe('Impressions Submitter for Lightweight Synchronizer', () => { const _mockImpressionsListWMetadata = getImpressionsListWithSameMetadata(2, true); _impressionsCacheMock.popNWithMetadata.mockReturnValue(Promise.resolve((_mockImpressionsListWMetadata))); - await _impressionsSubmiter(); + await _impressionsSubmitter(); expect(_impressionsCacheMock.popNWithMetadata).toBeCalledWith(IMPRESSIONS_PER_POST); }); @@ -346,7 +346,7 @@ describe('Impressions Submitter for Lightweight Synchronizer', () => { const MAX_RETRIES = 5; const _failPostImpressionsMock = jest.fn(() => Promise.reject()); - let _impressionsSubmiterToFail = impressionsSubmitterFactory( + let _impressionsSubmitterToFail = impressionsSubmitterFactory( noopLogger, // @ts-ignore _failPostImpressionsMock, // @ts-ignore _impressionsCacheMock, @@ -357,7 +357,7 @@ describe('Impressions Submitter for Lightweight Synchronizer', () => { const _mockImpressionsListWMetadata = getImpressionsListWithSameMetadata(2, true); _impressionsCacheMock.popNWithMetadata.mockReturnValue(Promise.resolve((_mockImpressionsListWMetadata))); - const res = await _impressionsSubmiterToFail(); + const res = await _impressionsSubmitterToFail(); expect(_impressionsCacheMock.popNWithMetadata).toBeCalledWith(1000); expect(_failPostImpressionsMock).toBeCalledTimes(5); diff --git a/src/submitters/impressionsSubmitter.ts b/src/submitters/impressionsSubmitter.ts index 46831f7..b1e4743 100644 --- a/src/submitters/impressionsSubmitter.ts +++ b/src/submitters/impressionsSubmitter.ts @@ -63,7 +63,7 @@ export const impressionWithMetadataToImpressionDTO = (storedImpression: StoredIm * @param {ImpressionObserver} observer The Impression Observer object for the dedupe process. * @param {number} impressionsPerPost Amount of elements to pop from storage. * @param {number} maxRetries Amount of attempt retries to perform the POST request. - * @param {IImpressionCountsCacheBase} countsCache The reference to the Impresion's Count Storage. Undefined in DEBUG mode. + * @param {IImpressionCountsCacheBase} countsCache The reference to the Impression's Count Storage. Undefined in DEBUG mode. * @returns {() => Promise} */ export function impressionsSubmitterFactory( diff --git a/src/synchronizers/SplitsSynchronizer.ts b/src/synchronizers/SplitsSynchronizer.ts index d2ff370..235229d 100644 --- a/src/synchronizers/SplitsSynchronizer.ts +++ b/src/synchronizers/SplitsSynchronizer.ts @@ -115,7 +115,7 @@ export class SplitsSynchronizer { } catch (error) { this._settings.log.error( - `Feature flags InMemory synchronization: Error when retreving data from external Storage. Error: ${error}` + `Feature flags InMemory synchronization: Error when retrieving data from external Storage. Error: ${error}` ); } } @@ -203,7 +203,7 @@ export class SplitsSynchronizer { } } /** - * Function to compare an inital InMemory cache snapshot with the updated InMemory cache after synchronization. + * Function to compare an initial InMemory cache snapshot with the updated InMemory cache after synchronization. * It will calculate differences, removing feature flags that are no longer required and updating the ones with new data. * * @returns {any} diff --git a/src/synchronizers/__tests__/SplitsSynchronizer.spec.ts b/src/synchronizers/__tests__/SplitsSynchronizer.spec.ts index b07a85e..d3b8e93 100644 --- a/src/synchronizers/__tests__/SplitsSynchronizer.spec.ts +++ b/src/synchronizers/__tests__/SplitsSynchronizer.spec.ts @@ -115,7 +115,7 @@ describe('Splits Synchronizer', () => { }); }); - describe('Process Differeces between data previous to Sync and new data.', () => { + describe('Process differences between data previous to Sync and new data.', () => { beforeAll(() => { createNewSynchronizer(); _splitsSynchronizer._inMemoryStorageSnapshot.splits.addSplits([ @@ -132,14 +132,14 @@ describe('Splits Synchronizer', () => { ]); }); - test('compares the updated InMemory cache with previous snapshot and removes [1] unusued split', async () => { + test('compares the updated InMemory cache with previous snapshot and removes [1] unused split', async () => { const result = await _splitsSynchronizer.processDifferences(); expect(result).toBe(1); }); }); - describe('Put data from InMemory Cache to storage - After synchronization occured', () => { + describe('Put data from InMemory Cache to storage - After synchronization occurred', () => { beforeAll(async () => { createNewSynchronizer(); // adding some data simulating synchronization execution') diff --git a/types/index.d.ts b/types/index.d.ts index a0fae81..6a5275e 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -111,7 +111,7 @@ declare module JsSyncTools { authorizationKey: string } /** - * Defines which kind of storage we should instanciate. + * Defines which kind of storage we should instantiate. * * @property {Object} storage */